none
Tranformar coluna em linha RRS feed

  • Pergunta

  • Bom dia a todos.

    Tenho um select no sql que preciso transformar as colunas de mês e quantidade em linhas, é possível, se for como posse fazer no meu select.

    Minha query

        

    SELECT
        SB.B1_DESC,
    m.nm_mes as Mes,
    m.cd_mes, 
    SUM(SD.D2_QUANT) AS QTDA

    FROM  SD2010 AS SD
          left outer join mes m on m.cd_mes = month(SD.D2_EMISSAO)
          INNER JOIN SB1010 AS SB WITH (NOLOCK) ON SB.B1_COD = SD.D2_COD
    WHERE SD.D_E_L_E_T_ <> '*' 
          AND SD.D2_CF IN ('5102', '5117', '5119', '5123', '5124', '5403', '5405', '6102', '6108', '6110', '6117', '6119', '6123', '6124', '6403', '6405', '7102')
          AND SD.D2_EMISSAO BETWEEN CONVERT(datetime,'01/01/2016', 103) AND CONVERT(datetime,'31/12/2016', 103) 
     AND SB.B1_DESC ='ARISTOFLEX AVC - CX25'
    GROUP BY SB.B1_DESC, m.nm_mes, m.cd_mes
    ORDER BY m.cd_mes

    Imagem com o Resultado


    JUNIOR GUERREIRO T.I

    segunda-feira, 10 de abril de 2017 13:09

Respostas

  • Tente usando pivot.

    Ficaria mais ou menos assim:

    SELECT 
    	B1_DESC
    	, [1] AS JANEIRO
        , [2] AS FEVEREIRO
        , [3] AS MARÇO
    	, [4] AS ABRIL
        , [5] AS MAIO
        , [6] AS JUNHO
        , [7] AS JULHO
        , [8] AS AGOSTO
        , [9] AS SETEMBRO
        , [10] AS OUTUBRO
    	, [11] AS NOVEMBRO
        , [12] AS DEZEMBRO
    FROM (
    SELECT
        SB.B1_DESC,
    m.nm_mes as Mes,
    m.cd_mes, 
    SUM(SD.D2_QUANT) AS QTDA
    
    FROM  SD2010 AS SD
          left outer join mes m on m.cd_mes = month(SD.D2_EMISSAO)
          INNER JOIN SB1010 AS SB WITH (NOLOCK) ON SB.B1_COD = SD.D2_COD
    WHERE SD.D_E_L_E_T_ <> '*' 
          AND SD.D2_CF IN ('5102', '5117', '5119', '5123', '5124', '5403', '5405', '6102', '6108', '6110', '6117', '6119', '6123', '6124', '6403', '6405', '7102')
          AND SD.D2_EMISSAO BETWEEN CONVERT(datetime,'01/01/2016', 103) AND CONVERT(datetime,'31/12/2016', 103) 
     AND SB.B1_DESC ='ARISTOFLEX AVC - CX25'
    GROUP BY SB.B1_DESC, m.nm_mes, m.cd_mes) AS Q
    PIVOT (SUM(QTDA) 
    FOR Mes IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]))P
    


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Marcado como Resposta Junior Guerreiro segunda-feira, 10 de abril de 2017 14:13
    segunda-feira, 10 de abril de 2017 13:30
  • Talvez porque você tem uma tabela com esse nome... experimente remover o alias da coluna nm_mes:

    select
        B1_DESC,
        [Janeiro],
        [Fevereiro],
        [Março],
        [Abril],
        [Maio],
        [Junho],
        [Julho],
        [Agosto],
        [Setembro],
        [Outubro],
        [Novembro],
        [Dezembro]
    from
    (
        SELECT
            SB.B1_DESC,
            m.nm_mes,
            SD.D2_QUANT
        FROM  SD2010 AS SD
        left outer join mes m on m.cd_mes = month(SD.D2_EMISSAO)
        INNER JOIN SB1010 AS SB WITH (NOLOCK) ON SB.B1_COD = SD.D2_COD
        WHERE SD.D_E_L_E_T_ <> '*' 
          AND SD.D2_CF IN ('5102', '5117', '5119', '5123', '5124', '5403', '5405', '6102', '6108', '6110', '6117', '6119', '6123', '6124', '6403', '6405', '7102')
          AND SD.D2_EMISSAO BETWEEN CONVERT(datetime,'01/01/2016', 103) AND CONVERT(datetime,'31/12/2016', 103) 
          AND SB.B1_DESC ='ARISTOFLEX AVC - CX25'
    ) as f
    pivot
    (
        SUM(D2_QUANT) FOR nm_mes IN 
            ([Janeiro], [Fevereiro], [Março], [Abril], [Maio], [Junho],
             [Julho], [Agosto], [Setembro], [Outubro], [Novembro], [Dezembro])
    ) as p

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Junior Guerreiro segunda-feira, 10 de abril de 2017 14:13
    segunda-feira, 10 de abril de 2017 13:39

Todas as Respostas

  • Bom dia,

    Experimente fazer uns testes utilizando Pivot:

    select
        B1_DESC,
        [Janeiro],
        [Fevereiro],
        [Março],
        [Abril],
        [Maio],
        [Junho],
        [Julho],
        [Agosto],
        [Setembro],
        [Outubro],
        [Novembro],
        [Dezembro]
    from
    (
        SELECT
            SB.B1_DESC,
            m.nm_mes as Mes,
            SD.D2_QUANT
        FROM  SD2010 AS SD
        left outer join mes m on m.cd_mes = month(SD.D2_EMISSAO)
        INNER JOIN SB1010 AS SB WITH (NOLOCK) ON SB.B1_COD = SD.D2_COD
        WHERE SD.D_E_L_E_T_ <> '*' 
          AND SD.D2_CF IN ('5102', '5117', '5119', '5123', '5124', '5403', '5405', '6102', '6108', '6110', '6117', '6119', '6123', '6124', '6403', '6405', '7102')
          AND SD.D2_EMISSAO BETWEEN CONVERT(datetime,'01/01/2016', 103) AND CONVERT(datetime,'31/12/2016', 103) 
          AND SB.B1_DESC ='ARISTOFLEX AVC - CX25'
    ) as f
    pivot
    (
        SUM(D2_QUANT) FOR MES IN 
            ([Janeiro], [Fevereiro], [Março], [Abril], [Maio], [Junho],
             [Julho], [Agosto], [Setembro], [Outubro], [Novembro], [Dezembro])
    ) as p

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 10 de abril de 2017 13:22
  • Tente usando pivot.

    Ficaria mais ou menos assim:

    SELECT 
    	B1_DESC
    	, [1] AS JANEIRO
        , [2] AS FEVEREIRO
        , [3] AS MARÇO
    	, [4] AS ABRIL
        , [5] AS MAIO
        , [6] AS JUNHO
        , [7] AS JULHO
        , [8] AS AGOSTO
        , [9] AS SETEMBRO
        , [10] AS OUTUBRO
    	, [11] AS NOVEMBRO
        , [12] AS DEZEMBRO
    FROM (
    SELECT
        SB.B1_DESC,
    m.nm_mes as Mes,
    m.cd_mes, 
    SUM(SD.D2_QUANT) AS QTDA
    
    FROM  SD2010 AS SD
          left outer join mes m on m.cd_mes = month(SD.D2_EMISSAO)
          INNER JOIN SB1010 AS SB WITH (NOLOCK) ON SB.B1_COD = SD.D2_COD
    WHERE SD.D_E_L_E_T_ <> '*' 
          AND SD.D2_CF IN ('5102', '5117', '5119', '5123', '5124', '5403', '5405', '6102', '6108', '6110', '6117', '6119', '6123', '6124', '6403', '6405', '7102')
          AND SD.D2_EMISSAO BETWEEN CONVERT(datetime,'01/01/2016', 103) AND CONVERT(datetime,'31/12/2016', 103) 
     AND SB.B1_DESC ='ARISTOFLEX AVC - CX25'
    GROUP BY SB.B1_DESC, m.nm_mes, m.cd_mes) AS Q
    PIVOT (SUM(QTDA) 
    FOR Mes IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]))P
    


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Marcado como Resposta Junior Guerreiro segunda-feira, 10 de abril de 2017 14:13
    segunda-feira, 10 de abril de 2017 13:30
  • Bom dia..

    Não rodou sua query, deu erro no mes da linha marcada em negrito.

    pivot
    (
        SUM(D2_QUANT) FOR MES IN 
            ([Janeiro], [Fevereiro], [Março], [Abril], [Maio], [Junho],
             [Julho], [Agosto], [Setembro], [Outubro], [Novembro], [Dezembro])
    ) as p


    JUNIOR GUERREIRO T.I

    segunda-feira, 10 de abril de 2017 13:32
  • Talvez porque você tem uma tabela com esse nome... experimente remover o alias da coluna nm_mes:

    select
        B1_DESC,
        [Janeiro],
        [Fevereiro],
        [Março],
        [Abril],
        [Maio],
        [Junho],
        [Julho],
        [Agosto],
        [Setembro],
        [Outubro],
        [Novembro],
        [Dezembro]
    from
    (
        SELECT
            SB.B1_DESC,
            m.nm_mes,
            SD.D2_QUANT
        FROM  SD2010 AS SD
        left outer join mes m on m.cd_mes = month(SD.D2_EMISSAO)
        INNER JOIN SB1010 AS SB WITH (NOLOCK) ON SB.B1_COD = SD.D2_COD
        WHERE SD.D_E_L_E_T_ <> '*' 
          AND SD.D2_CF IN ('5102', '5117', '5119', '5123', '5124', '5403', '5405', '6102', '6108', '6110', '6117', '6119', '6123', '6124', '6403', '6405', '7102')
          AND SD.D2_EMISSAO BETWEEN CONVERT(datetime,'01/01/2016', 103) AND CONVERT(datetime,'31/12/2016', 103) 
          AND SB.B1_DESC ='ARISTOFLEX AVC - CX25'
    ) as f
    pivot
    (
        SUM(D2_QUANT) FOR nm_mes IN 
            ([Janeiro], [Fevereiro], [Março], [Abril], [Maio], [Junho],
             [Julho], [Agosto], [Setembro], [Outubro], [Novembro], [Dezembro])
    ) as p

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Junior Guerreiro segunda-feira, 10 de abril de 2017 14:13
    segunda-feira, 10 de abril de 2017 13:39
  • Muito obrigado pela ajuda..

    deu certo agora 

    Vlw


    JUNIOR GUERREIRO T.I

    segunda-feira, 10 de abril de 2017 14:14