Usuário com melhor resposta
Múltiplas consultas em uma única query

Pergunta
-
Olá,
Bom Dia
Gostaria de compartilhar com vcs uma dúvida refente a multiplas consultas, no caso, preciso usar o resultado de uma consulta pra fazer outra.
Tenho uma tabela com nome, pontuação e data, onde em um mesmo dia uma pessoa faz varias pontuações
Ex:
Nome data pontos
JOAO 01/01/2015 1,5
JOAO 01/01/2015 0,50
MARIA 02/01/2015 1,32
executando a consulta: select nome, data, sum(pontos) from tbdados where data >= '01/01/2015' and data <= '31/01/2015' group by nome, data order by nome,data eu consigo a lista da pontos que a pessoa fez por dia, porém o que eu preciso é da média mensal que cada pessoa fez, então eu preciso usar o resultado dessa consulta pra fazer outra (AVG), e depois disso preciso fazer a media de cada mes, ou seja, o resultado final precisa ser:
Jan Fev Mar
JOAO 1,2 1,3 0,9
MARIA 0,8 2,5 1,7
Estou meio perdido pois vejo soluções como subquery, while, array mas estou me embananando na hora de colocar isso na minha situação. Alguém poderia me dar um empurrão?
Obrigado.
Respostas
-
Bom dia,
Engatador, segue uma sugestão para teste:
with CTE_Sum as ( select Nome, Data, SUM(Pontos) as Pontos from TbDados where Data between '01/01/2015' and '31/03/2015' group by Nome, Data ) select Nome, [Jan], [Fev], [Mar] from ( select Nome, LEFT(DATENAME(MONTH, Data), 3) as Mes, Pontos from CTE_Sum ) as t pivot ( avg(Pontos) for Mes in ([Jan], [Fev], [Mar]) ) as p
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Marcos SJ quinta-feira, 21 de janeiro de 2016 11:08
Todas as Respostas
-
Engatator,
cara você vai ter que fazer um PIVOT, vou te mandar a ideia:
SELECT nome, data, sum(pontos) INTO #Temp FROM tbdados where data >= '01/01/2015' and data <= '31/01/2015' group by nome, data order by nome,data SELECT nome, data, AVG(PONTOS) FROM #Temp group by nome, data order by nome,data DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(data) FROM #Temp t FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'),1,1,'') SET @query = 'SELECT nome, ' + @cols + ' FROM #Temp t PIVOT(avg(PONTOS) FOR data IN(' + @cols + ')) AS J' execute(@query)
- Editado RenatoCastro quarta-feira, 20 de janeiro de 2016 12:23
-
Enganador,
Você talvez poderia utilizar agrupamento por nome e ano/mês utilizando as funções YEAR e MONTH ou DATEPART.
Outra sugestão seria a utilização da função OVER para agrupar as informações e talvez particionar por nome e data.
Depois que você tiver os resultados finais pode rotacionar as linhas para colunas com a ajuda da função PIVOT do SQL Server.
Leia algumas referências dessas funções nos links abaixo:
OVER
https://msdn.microsoft.com/pt-br/library/ms189461%28v=sql.120%29.aspx?f=255&MSPPError=-2147217396
YEAR
https://msdn.microsoft.com/pt-br/library/ms186313(v=sql.120).aspx
MONTH
https://msdn.microsoft.com/pt-br/library/ms187813(v=sql.120).aspx
DATEPART
https://msdn.microsoft.com/pt-br/library/ms174420(v=sql.120).aspx
PIVOT
https://technet.microsoft.com/pt-br/library/ms177410(v=sql.105).aspx
Felipe Lauffer MCSA: SQL Server | MCP
-
Bom dia,
Engatador, segue uma sugestão para teste:
with CTE_Sum as ( select Nome, Data, SUM(Pontos) as Pontos from TbDados where Data between '01/01/2015' and '31/03/2015' group by Nome, Data ) select Nome, [Jan], [Fev], [Mar] from ( select Nome, LEFT(DATENAME(MONTH, Data), 3) as Mes, Pontos from CTE_Sum ) as t pivot ( avg(Pontos) for Mes in ([Jan], [Fev], [Mar]) ) as p
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Marcos SJ quinta-feira, 21 de janeiro de 2016 11:08
-
-
-