Usuário com melhor resposta
Pivot retornando mais de uma linha

Pergunta
-
Colegas
Usei o Exemplo abaixo como base para meus exemplos
Code SnippetCreate
table #Exemplo (codigo int, nome varchar(10))insert
into #Exemplo (codigo, nome) Values (1,'jose')insert
into #Exemplo (codigo, nome) Values (2,'mario')insert
into #Exemplo (codigo, nome) Values (1,'jose')insert
into #Exemplo (codigo, nome) Values (2,'mario')insert
into #Exemplo (codigo, nome) Values (3,'celso')insert
into #Exemplo (codigo, nome) Values (4,'andre')Select
[jose],[mario],[celso],[andre] from #exemploPivot
(count(codigo) for nome in ([jose],[mario],[celso],[andre])) pResultado:
jose mario celso andre
----------- ----------- ----------- -----------
2 2 1 1
Acontece que minha tabela tem mais um Atributo ( idUsuario ) e seria assim:
Code SnippetCreate
table #Exemplo (codigo int, nome varchar(10), idUsuario int)insert
into #Exemplo (codigo, nome, idUsuario) Values (1,'jose', 12)insert
into #Exemplo (codigo, nome, idUsuario) Values (2,'mario', 7)insert
into #Exemplo (codigo, nome, idUsuario) Values (1,'jose', 14)insert
into #Exemplo (codigo, nome, idUsuario) Values (2,'mario', 12)insert
into #Exemplo (codigo, nome, idUsuario) Values (3,'celso', 7)insert
into #Exemplo (codigo, nome, idUsuario) Values (4,'andre', 14)Select
[jose],[mario],[celso],[andre] from #exemploPivot
(count(codigo) for nome in ([jose],[mario],[celso],[andre])) pResultado:
jose mario celso andre
----------- ----------- ----------- -----------
0 1 1 0
1 1 0 0
1 0 0 1
Gostaria de saber como faço para ter somente uma linha como no exemplo acima, o PIVOT não precisa considerar o atributo ( idUsuario ).
Também gostaria de uma explicação de porque o ( p ) no final do PIVOT.
Obrigado
Bene
Respostas
-
Boa Tarde,
Se o problema estiver com o IDUsuario, nada que uma CTE não resolva. Tente o seguinte:
Code Snippetwith
consulta as (select codigo, nome from #Exemplo)Select
[jose],[mario],[celso],[andre] from ConsultaPivot
(count(codigo) for nome in ([jose],[mario],[celso],[andre])) pO Pivot internamente usa algumas implementações muito parecidas com subqueries e algumas vezes precisamos nomeá-las. Ex: SELECT * FROM (SELECT <Algo> FROM Tabela) As P
Nesse caso P é o nome para a subquery (SELECT <Algo> FROM Tabela) e poderemos referenciá-la posteriormente.
Você pode utilizar outra letra ou nome se preferir
[ ]s,
Gustavo
-
Olá Benê,
Acredito que embora relacionado, sua dúvida deveria estar em um novo post. De qualquer forma segue a solução
Code SnippetSELECT
[2005], [2006], [2007], [2005] + [2006] + [2007] As TotalFROM
(SELECT Yr, Sales FROM Sales) AS sPIVOT
(SUM(Sales) FOR Yr IN ([2005], [2006], [2007])) AS p[ ]s,
Gustavo
Todas as Respostas
-
Boa Tarde,
Se o problema estiver com o IDUsuario, nada que uma CTE não resolva. Tente o seguinte:
Code Snippetwith
consulta as (select codigo, nome from #Exemplo)Select
[jose],[mario],[celso],[andre] from ConsultaPivot
(count(codigo) for nome in ([jose],[mario],[celso],[andre])) pO Pivot internamente usa algumas implementações muito parecidas com subqueries e algumas vezes precisamos nomeá-las. Ex: SELECT * FROM (SELECT <Algo> FROM Tabela) As P
Nesse caso P é o nome para a subquery (SELECT <Algo> FROM Tabela) e poderemos referenciá-la posteriormente.
Você pode utilizar outra letra ou nome se preferir
[ ]s,
Gustavo
-
Caro Gustavo..... batalhei bastante no cenário acima e gostaria novamente de sua ajuda se possível.
Criei um novo exemplo para ilustrar o que eu desejo e o ponto que estou, então veja o código a ser criado.
Code SnippetCREATE
TABLE Sales (EmpId INT, Yr INT, Sales MONEY)INSERT
Sales VALUES(1, 2005, 12000)INSERT
Sales VALUES(1, 2006, 18000)INSERT
Sales VALUES(1, 2007, 25000)INSERT
Sales VALUES(2, 2005, 15000)INSERT
Sales VALUES(2, 2006, 6000)INSERT
Sales VALUES(3, 2006, 20000)INSERT
Sales VALUES(3, 2007, 24000)SELECT
[2005], [2006], [2007]FROM
(SELECT Yr, Sales FROM Sales) AS sPIVOT
(SUM(Sales) FOR Yr IN ([2005], [2006], [2007])) AS pResultado RETORNADO:
2005 2006 2007
--------- --------- ---------
27000,00 44000,00 49000,00
Resultado DESEJADO:
2005 2006 2007 SubTotal
--------- --------- --------- ---------
27000,00 44000,00 49000,00 120000,00
-
Olá Benê,
Acredito que embora relacionado, sua dúvida deveria estar em um novo post. De qualquer forma segue a solução
Code SnippetSELECT
[2005], [2006], [2007], [2005] + [2006] + [2007] As TotalFROM
(SELECT Yr, Sales FROM Sales) AS sPIVOT
(SUM(Sales) FOR Yr IN ([2005], [2006], [2007])) AS p[ ]s,
Gustavo
-
-
Caramba, acabei de postar e o cara já respondeu.... muito Obrigado...
Na Microsoft que tenho suporte PAGO, demoram 5min para entender, 20 min para preencher a solicitação e no final a resposta, "Sua questão será respondida via e-mail em até 48horas".
MUITO OBRIGADO
GUSTAVO.
-
Olá Benê,
O suporte Microsoft tem de seguir uma série de procedimentos que vão desde o registro do chamado, o mútuo acordo sobre o real problema a ser resolvido, o escalomento do engenheiro, a árdua mas necessária coleta de logs, etc. São procedimentos necessários (embora algumas vezes desgastantes) para documentar, analisar, propor alternativas e resolver o problema de forma efetiva.
Acredito que para problemas mais graves como servidor indisponível, graves degradações de desempenho ou ainda comportamento inesperado justifiquem todos esses procedimentos, mas para dúvidas mais pontuais realmente a solução pode demorar mais que o necessário e nesse caso é interessante procurar fontes alternativas. Acredito que seja esse um dos propósitos do MSDN e do Technet.
Que bom que a resposta lhe foi satisfatória. Aproveite para fechar o chamado antes que as horas sejam debitadas.
[ ]s,
Gustavo