none
Pivot retornando mais de uma linha RRS feed

  • Pergunta

  • Colegas

     

    Usei o Exemplo abaixo como base para meus exemplos

     

    Code Snippet

    Create 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 #exemplo

    Pivot (count(codigo) for nome in ([jose],[mario],[celso],[andre])) p

     

    Resultado:

    jose        mario       celso       andre

    ----------- ----------- ----------- -----------

    2           2           1           1

     

     

    Acontece que minha tabela tem mais um Atributo ( idUsuario ) e seria assim:

     

    Code Snippet

    Create 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 #exemplo

    Pivot (count(codigo) for nome in ([jose],[mario],[celso],[andre])) p

     

    Resultado:

    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

    segunda-feira, 14 de abril de 2008 19:38

Respostas

  • Boa Tarde,

     

    Se o problema estiver com o IDUsuario, nada que uma CTE não resolva. Tente o seguinte:

     

    Code Snippet

    with consulta as (select codigo, nome from #Exemplo)

    Select [jose],[mario],[celso],[andre] from Consulta

    Pivot (count(codigo) for nome in ([jose],[mario],[celso],[andre])) p

     

     

    O 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

     

    segunda-feira, 14 de abril de 2008 20:17
  • Olá Benê,

     

    Acredito que embora relacionado, sua dúvida deveria estar em um novo post. De qualquer forma segue a solução

     

    Code Snippet

    SELECT [2005], [2006], [2007], [2005] + [2006] + [2007] As Total

    FROM (SELECT Yr, Sales FROM Sales) AS s

    PIVOT (SUM(Sales) FOR Yr IN ([2005], [2006], [2007])) AS p

     

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 15 de abril de 2008 17:05

Todas as Respostas

  • Boa Tarde,

     

    Se o problema estiver com o IDUsuario, nada que uma CTE não resolva. Tente o seguinte:

     

    Code Snippet

    with consulta as (select codigo, nome from #Exemplo)

    Select [jose],[mario],[celso],[andre] from Consulta

    Pivot (count(codigo) for nome in ([jose],[mario],[celso],[andre])) p

     

     

    O 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

     

    segunda-feira, 14 de abril de 2008 20:17
  • 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 Snippet

    CREATE 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 s

    PIVOT (SUM(Sales) FOR Yr IN ([2005], [2006], [2007])) AS p

     

    Resultado RETORNADO:

    2005      2006      2007      

    --------- --------- ---------

    27000,00  44000,00  49000,00  

     

    Resultado DESEJADO:

    2005      2006      2007      SubTotal

    --------- --------- --------- ---------

    27000,00  44000,00  49000,00  120000,00

     

     

    terça-feira, 15 de abril de 2008 16:58
  • Olá Benê,

     

    Acredito que embora relacionado, sua dúvida deveria estar em um novo post. De qualquer forma segue a solução

     

    Code Snippet

    SELECT [2005], [2006], [2007], [2005] + [2006] + [2007] As Total

    FROM (SELECT Yr, Sales FROM Sales) AS s

    PIVOT (SUM(Sales) FOR Yr IN ([2005], [2006], [2007])) AS p

     

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 15 de abril de 2008 17:05
  • Gustavo,

     

    Parabéns como sempre uma solução escondida na manga.

    terça-feira, 15 de abril de 2008 17:12
  • 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.

     

    terça-feira, 15 de abril de 2008 17:46
  • 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

     

    terça-feira, 15 de abril de 2008 17:59