none
Ajuda com Pivot RRS feed

  • 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,PD

    mas não consigo colocar o ValorTotal

    terça-feira, 27 de outubro de 2015 13:27

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. */

    terça-feira, 27 de outubro de 2015 15:33

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]

    terça-feira, 27 de outubro de 2015 13:34
  • 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

    terça-feira, 27 de outubro de 2015 14:27
  • 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]

    terça-feira, 27 de outubro de 2015 14:47
  • Não faço agrupamento, os dados já estão assim
    terça-feira, 27 de outubro de 2015 15:09
  • 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. */

    terça-feira, 27 de outubro de 2015 15:10
  • 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

    terça-feira, 27 de outubro de 2015 15:14
  • 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. */

    terça-feira, 27 de outubro de 2015 15:33
  • Logan

    Deu certo.....muito obrigado

    Poderia me explicar a parte do over partition by ?


    terça-feira, 27 de outubro de 2015 15:52
  • 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. */

    terça-feira, 27 de outubro de 2015 16:04
  • entendi
    terça-feira, 27 de outubro de 2015 16:25