Usuário com melhor resposta
Ajuda com Pivot

Pergunta
-
Pessoal,
Por favor preciso de ajuda com pivot
Tenho essa tabela
NR_DOCUMENTO TP_DOCUMENTO VL_PAGTO 2013LI00241 LB 100689.35 2013NL02459 NL 100689.36 2013PD01606 PD 100689.37 2013LI00272 LB 91998.05 2013NL02770 NL 91998.06 2013PD01797 PD 91998.06 2013LI00025 LB 1411.62 2013NL01917 NL 1411.63 2013PD01237 PD 1411.63 e gostaria de transformar desse jeito:
LB NL PD ValorTotal 2013LI00241 2013NL02459 2013PD01606 302068.05 2013LI00272 2013NL02770 2013PD01797 275994.18 2013LI00025 2013NL01917 2013PD01237 4234.89 construi essa sql
SELECT
LB,ER,NL,PD
FROM (SELECT TP_DOCUMENTO, NR_DOCUMENTO, VL_PAGTO from UtilidadePublica_prd_20150930..T_DOC_CRIADO) As TheSource
PIVOT
(
min(NR_DOCUMENTO)
FOR
TP_DOCUMENTO
IN (LB,ER,NL,PD)
) AS PIVOTALIAS
order by LB,ER,NL,PDmas não consigo colocar o ValorTotal
Respostas
-
Dê uma olhada no bloco abaixo... faça um teste e veja se encaixa no que precisa:
CREATE TABLE Documentos (NR_DOCUMENTO varchar(20), TP_DOCUMENTO char(2), VL_PAGTO decimal(15,2)) GO insert into Documentos values ('2013LI00241', 'LB', 100689.35), ('2013NL02459', 'NL', 100689.35), ('2013PD01606', 'PD', 100689.35), ('2013LI00272', 'LB', 91998.06), ('2013NL02770', 'NL', 91998.06), ('2013PD01797', 'PD', 91998.06), ('2013LI00025', 'LB', 1411.63), ('2013NL01917', 'NL', 1411.63), ('2013PD01237', 'PD', 1411.63) GO SELECT LB,NL,PD,TOTAL FROM ( SELECT TP_DOCUMENTO, NR_DOCUMENTO, VL_PAGTO, SUM(VL_Pagto) OVER(PARTITION BY vl_pagto) AS TOTAL from Documentos UNION ALL SELECT 'VL', 'VALOR TOTAL', VL_PAGTO, SUM(VL_Pagto) from Documentos group by VL_PAGTO ) As TheSource PIVOT ( MAX(NR_DOCUMENTO) FOR TP_DOCUMENTO IN (LB,NL,PD,VL) ) AS PIVOTALIAS
[]'s!
/* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */- Marcado como Resposta Rafael Augusto Miranda terça-feira, 27 de outubro de 2015 15:58
Todas as Respostas
-
Rafael,
Como o valor total é calculado?
Em qual parte do seu Select você esta declarando a apresentação desta coluna?
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Para cada tido de documento os valores são iguais queria somar esse valores e colocar na coluna ValorTotal.
Na explicação do meu problema logo acima e coloquei no excel somente para mostrar o jeito que estou buscando.
No SQL a pivotagem eu consegui só não consigo fazer essas somatoria
-
Rafael,
Então mas a somatória tem que ser feita antes da pivotagem.
Como você esta agrupando estes dados?
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
RafaelAugusto,
Você não tem nenhum campo que possa usar como referência para agrupamento entre os três registros? Por exemplo, um Codigo para cada conjunto de informação ou algum registro "Pai"? É possível montar a consulta agrupando o valor propriamente dito, mas como os valores estão com os centavos diferentes, seria preciso descartar os centavos para o agrupamento funcionar. Mas cá entre nós, isso não me parece uma solução 'correta' olhando o cenário.
Eu ia colocar uma consulta de exemplo realizando o agrupamento pelo valor, mas antes gostaria de saber se você não tem algum outro campo para que possamos fazer esse agrupamento de uma forma mais confiável.
[]'s!
/* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */ -
Logan,
Me desculpe, os centavos estão sim iguais, é q eu montei no excel e acabei errando e postando, tem sim um Id sequencial
CD_ID_DOC_CRIADO NR_DOCUMENTO TP_DOCUMENTO VL_PAGTO 1 2013LI00241 LB 100689.35 3 2013NL02459 NL 100689.35 4 2013PD01606 PD 100689.35 5 2013LI00272 LB 91998.06 6 2013NL02770 NL 91998.06 7 2013PD01797 PD 91998.06 8 2013LI00025 LB 1411.63 9 2013NL01917 NL 1411.63 10 2013PD01237 PD 1411.63
-
Dê uma olhada no bloco abaixo... faça um teste e veja se encaixa no que precisa:
CREATE TABLE Documentos (NR_DOCUMENTO varchar(20), TP_DOCUMENTO char(2), VL_PAGTO decimal(15,2)) GO insert into Documentos values ('2013LI00241', 'LB', 100689.35), ('2013NL02459', 'NL', 100689.35), ('2013PD01606', 'PD', 100689.35), ('2013LI00272', 'LB', 91998.06), ('2013NL02770', 'NL', 91998.06), ('2013PD01797', 'PD', 91998.06), ('2013LI00025', 'LB', 1411.63), ('2013NL01917', 'NL', 1411.63), ('2013PD01237', 'PD', 1411.63) GO SELECT LB,NL,PD,TOTAL FROM ( SELECT TP_DOCUMENTO, NR_DOCUMENTO, VL_PAGTO, SUM(VL_Pagto) OVER(PARTITION BY vl_pagto) AS TOTAL from Documentos UNION ALL SELECT 'VL', 'VALOR TOTAL', VL_PAGTO, SUM(VL_Pagto) from Documentos group by VL_PAGTO ) As TheSource PIVOT ( MAX(NR_DOCUMENTO) FOR TP_DOCUMENTO IN (LB,NL,PD,VL) ) AS PIVOTALIAS
[]'s!
/* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */- Marcado como Resposta Rafael Augusto Miranda terça-feira, 27 de outubro de 2015 15:58
-
-
A Cláusula OVER é uma Window Function, com ela você consegue realizar agregações sem necessariamente agrupar os dados, trabalhando com um frame do teu result set.
No teu caso, 'particionei' a tua tabela pelo valor (que tem os mesmo dados, por isso a importância de existir uma coluna que permitisse essa separação) e somei as linhas que tinham o mesmo valor.
Se quiser conhecer mais sobre a Clausula OVER:
https://msdn.microsoft.com/pt-br/library/ms189461%28v=sql.120%29.aspx?f=255&MSPPError=-2147217396
http://blog.merazzi.eti.br/?p=52 -> Meu Blog
[]'s!
/* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */ -