none
Pivot sem função de agregação. RRS feed

  • Pergunta

  • Ola pessoal, gostaria de saber se existe alguma função similar ao pivot que não seja obrigatório o uso de alguma função de agregação para sua execução, por exemplo:

    SELECT   CL, 
          [01] AS "GRUPO O1", 
          [02] AS "GRUPO 02", 
          [03] AS "GRUPO 03", 
          [04] AS "GRUPO 04", 
          [05] AS "GRUPO 05" 
    FROM   FREQUENCIA PIVOT(COUNT(SITUACAO) FOR GRUPO IN([01],[02],[03],[04],[05])) P 

    Como eu hipotéticamente preciso:

    SELECT   CL, 
          [01] AS "GRUPO O1", 
          [02] AS "GRUPO 02", 
          [03] AS "GRUPO 03", 
          [04] AS "GRUPO 04", 
          [05] AS "GRUPO 05" 
    FROM   FREQUENCIA PIVOT(SITUACAO FOR GRUPO IN([01],[02],[03],[04],[05])) P 

    Ou se puderem me indicar alguma outra maneira de exibir os resultados que são retornados em colunas,  exibi-los em linhas, ficarei muito grato. Obrigado.


    • Editado Evertoum quarta-feira, 1 de agosto de 2012 20:39
    quarta-feira, 1 de agosto de 2012 20:37

Respostas

  • Evertoum,

    De acordo com o que você falou, se os seus campos são só numéricos, você pode usar um sum como agregação que não ter influenciar nos teus dados, uma vez que ele vai somar dados únicos.

    Caso você precise pivotear dados onde os valores são do tipo varchar, você pode, por exemplo, usar um MAX como função de agregação.

    Fiz um teste de acordo com o teu exemplo e funcionou tranquilamente, veja:

    create table pivotea (id varchar(3), valorcomposto int, expressao varchar(20))
    go
    insert into pivotea values 
    ('111', 0, 'expressao1'),
    ('GAB', 37111, 'expressao1'),
    ('GAB', 0, 'expressao2'),
    ('GAB', 0, 'expressao3'),
    ('GAB', 0, 'expressao4'),
    ('GAB', 0, 'expressao5'),
    ('HWD', 37111, 'expressao1'),
    ('HWD', 0, 'expressao2'),
    ('HWD', 0, 'expressao3'),
    ('HWD', 0, 'expressao4'),
    ('HWD', 0, 'expressao5'),
    ('RV2', 18555, 'expressao1'),
    ('RV2', 0, 'expressao2'),
    ('RV2', 0, 'expressao3'),
    ('RV2', 0, 'expressao4'),
    ('RV2', 0, 'expressao5')
    
    GO
    
    SELECT  id, 
          expressao1,
          expressao2,
          expressao3,
          expressao4,
          expressao5
    FROM  (select id, valorcomposto, expressao from pivotea) pvt
    PIVOT( sum(valorcomposto) FOR expressao IN(expressao1, expressao2, expressao3,expressao4,expressao5)) as P 

    Espero ter te ajudado.

    []'s

    • Marcado como Resposta Evertoum quinta-feira, 2 de agosto de 2012 14:27
    quinta-feira, 2 de agosto de 2012 14:01
  • Boa Noite,

    Infelizmente o PIVOT força o uso de uma função de agregação.
    Entretanto é possível "enganá-lo" ou usar funções de agregação que não vão de fato agregar.

    Um primeiro ponto de partida está no link abaixo:

    Pivoteando, Despivoteando, Transpondo, Invertendo Colunas e Linhas no SQL Server
    http://gustavomaiaaguiar.wordpress.com/2009/07/13/pivoteando-despivoteando-transpondo-invertendo-colunas-e-linhas-no-sql-server/

    Se você puder postar uma tabela com alguns registros e o resultado esperado talvez possámos ser mais efetivos em ajudá-lo

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Marcado como Resposta Evertoum quinta-feira, 2 de agosto de 2012 14:27
    quarta-feira, 1 de agosto de 2012 22:11
  • Entendi, irei anexar alguns dados para melhor visualização do problema, se puder me ajudar ficarei muito grato. Pq estou meio preocupado com a questão rsrs.

    Como os dados se encontram:

    Como necessito visualiza-los:


    • Editado Evertoum quinta-feira, 2 de agosto de 2012 13:56
    • Marcado como Resposta Evertoum quinta-feira, 2 de agosto de 2012 14:27
    quinta-feira, 2 de agosto de 2012 13:26

Todas as Respostas

  • Boa Noite,

    Infelizmente o PIVOT força o uso de uma função de agregação.
    Entretanto é possível "enganá-lo" ou usar funções de agregação que não vão de fato agregar.

    Um primeiro ponto de partida está no link abaixo:

    Pivoteando, Despivoteando, Transpondo, Invertendo Colunas e Linhas no SQL Server
    http://gustavomaiaaguiar.wordpress.com/2009/07/13/pivoteando-despivoteando-transpondo-invertendo-colunas-e-linhas-no-sql-server/

    Se você puder postar uma tabela com alguns registros e o resultado esperado talvez possámos ser mais efetivos em ajudá-lo

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Marcado como Resposta Evertoum quinta-feira, 2 de agosto de 2012 14:27
    quarta-feira, 1 de agosto de 2012 22:11
  • Entendi, irei anexar alguns dados para melhor visualização do problema, se puder me ajudar ficarei muito grato. Pq estou meio preocupado com a questão rsrs.

    Como os dados se encontram:

    Como necessito visualiza-los:


    • Editado Evertoum quinta-feira, 2 de agosto de 2012 13:56
    • Marcado como Resposta Evertoum quinta-feira, 2 de agosto de 2012 14:27
    quinta-feira, 2 de agosto de 2012 13:26
  • Evertoum,

    De acordo com o que você falou, se os seus campos são só numéricos, você pode usar um sum como agregação que não ter influenciar nos teus dados, uma vez que ele vai somar dados únicos.

    Caso você precise pivotear dados onde os valores são do tipo varchar, você pode, por exemplo, usar um MAX como função de agregação.

    Fiz um teste de acordo com o teu exemplo e funcionou tranquilamente, veja:

    create table pivotea (id varchar(3), valorcomposto int, expressao varchar(20))
    go
    insert into pivotea values 
    ('111', 0, 'expressao1'),
    ('GAB', 37111, 'expressao1'),
    ('GAB', 0, 'expressao2'),
    ('GAB', 0, 'expressao3'),
    ('GAB', 0, 'expressao4'),
    ('GAB', 0, 'expressao5'),
    ('HWD', 37111, 'expressao1'),
    ('HWD', 0, 'expressao2'),
    ('HWD', 0, 'expressao3'),
    ('HWD', 0, 'expressao4'),
    ('HWD', 0, 'expressao5'),
    ('RV2', 18555, 'expressao1'),
    ('RV2', 0, 'expressao2'),
    ('RV2', 0, 'expressao3'),
    ('RV2', 0, 'expressao4'),
    ('RV2', 0, 'expressao5')
    
    GO
    
    SELECT  id, 
          expressao1,
          expressao2,
          expressao3,
          expressao4,
          expressao5
    FROM  (select id, valorcomposto, expressao from pivotea) pvt
    PIVOT( sum(valorcomposto) FOR expressao IN(expressao1, expressao2, expressao3,expressao4,expressao5)) as P 

    Espero ter te ajudado.

    []'s

    • Marcado como Resposta Evertoum quinta-feira, 2 de agosto de 2012 14:27
    quinta-feira, 2 de agosto de 2012 14:01
  • Muito obrigado pela prestatividade Logan e Gustavo, brigado mesmo. O meu medo era ao utilizar a função de agregação, essa função utilizada influênciar no resultado final da exibição, o que não poderia ocorrer. Mas pelo modo que o Logan postou de fato acredito que os dados não sofreram alterações.

    Obrigado, até breve.

    quinta-feira, 2 de agosto de 2012 14:27