Usuário com melhor resposta
Pivot sem função de agregação.

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
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
-
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/gmasqlClassifique as respostas. O seu feedback é imprescindível
- Marcado como Resposta Evertoum quinta-feira, 2 de agosto de 2012 14:27
-
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:
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/gmasqlClassifique as respostas. O seu feedback é imprescindível
- Marcado como Resposta Evertoum quinta-feira, 2 de agosto de 2012 14:27
-
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:
-
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
-
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.