none
Ano em coluna RRS feed

  • Pergunta

  • Pessoal, bom dia! 

    Tenho a query abaixo

    SELECT SUBSTRING(D3_EMISSAO,1,4) ANO, D3_COD AS CODIGO, 
    B1_DESC AS DESCRICAO, B1_UM AS UNID,
    SUM(D3_QUANT) QtdeProduzida
    FROM SB1010 SB1(NOLOCK),SD3010 SD3(NOLOCK) 
    WHERE SD3.D_E_L_E_T_ <> '*' 
    AND SD3.D3_COD = SB1.B1_COD 
    AND SD3.D3_FILIAL = SB1.B1_FILIAL 
    AND SB1.B1_FILIAL = '01'
    AND SD3.D3_EMISSAO BETWEEN '20180101' AND '20211231'
    AND SB1.B1_COD BETWEEN 'AAAAAA', and 'ZZZZZZ'
    AND SD3.D3_LOCAL IN ('03','98') 
    AND SD3.D3_TM = '001' 
    AND SD3.D3_ESTORNO <> 'S'
    and (SD3.D3_COD LIKE 'OXIFFL%' or SD3.D3_COD LIKE 'OXIFFS%' or SD3.D3_COD LIKE 'OXINPK%')
    GROUP BY SUBSTRING(D3_EMISSAO,1,4),D3_COD, B1_DESC,B1_UM 
    ORDER BY SUBSTRING(D3_EMISSAO,1,4),D3_COD 


    Ela retorna da seguinte forma:

    ANO, CODIGO, DESCRICAO, QUANTIDADE

    2018,  OXIFSC124, XXXXXXXX, 1000

    2019,  OXIFSC149, YYYYYYYYY, 2000, etc

    Eu precisava fazer com que o resultado fosse:

    CODIGO, DESCRICAO, 2018, 2019, 2020, 2021

    OXIFSC124 XXXXXXXX, 1000, 0, 0, 0

    OXIFSC149 YYYYYYYYY,      0, 2000, 0, 0

    ou seja, para cada produto entre AAAAAA e ZZZZZZ teria uma linha e na coluna do ano correspondente a quantidade ou 0 caso nao tenha sido produzido o produto no período.

    Será que dá pra fazer em query??

    quinta-feira, 16 de setembro de 2021 12:29

Todas as Respostas

  • Bom dia,

    Uma alternativa seria utilizar o operador Pivot. Uma outra alternativa seria utilizar um Case dentro do Sum:

    WITH CTE_BASE AS
    (
        SELECT SUBSTRING(D3_EMISSAO,1,4) ANO, D3_COD AS CODIGO, 
        B1_DESC AS DESCRICAO, B1_UM AS UNID, QtdeProduzida
        FROM SB1010 SB1(NOLOCK),SD3010 SD3(NOLOCK) 
        WHERE SD3.D_E_L_E_T_ <> '*' 
        AND SD3.D3_COD = SB1.B1_COD 
        AND SD3.D3_FILIAL = SB1.B1_FILIAL 
        AND SB1.B1_FILIAL = '01'
        AND SD3.D3_EMISSAO BETWEEN '20180101' AND '20211231'
        AND SB1.B1_COD BETWEEN 'AAAAAA', and 'ZZZZZZ'
        AND SD3.D3_LOCAL IN ('03','98') 
        AND SD3.D3_TM = '001' 
        AND SD3.D3_ESTORNO <> 'S'
        and (SD3.D3_COD LIKE 'OXIFFL%' or SD3.D3_COD LIKE 'OXIFFS%' or SD3.D3_COD LIKE 'OXINPK%')
    )
    
    SELECT 
        CODIGO, 
        DESCRICAO,
        UNID,
        SUM(CASE WHEN ANO = '2018' THEN QtdeProduzida ELSE 0 END) AS [2018],
        SUM(CASE WHEN ANO = '2019' THEN QtdeProduzida ELSE 0 END) AS [2019],
        SUM(CASE WHEN ANO = '2020' THEN QtdeProduzida ELSE 0 END) AS [2020],
        SUM(CASE WHEN ANO = '2021' THEN QtdeProduzida ELSE 0 END) AS [2021]
    FROM CTE_BASE
    GROUP BY CODIGO, DESCRICAO, UNID 
    ORDER BY CODIGO
    

    Espero que ajude


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

    • Sugerido como Resposta Mauricio-Junior quinta-feira, 16 de setembro de 2021 15:07
    quinta-feira, 16 de setembro de 2021 14:45
  • Luis,

    Eu pensei no uso do operador Pivot.

    Veja se os exemplos abaixo aplicados a um outro contexto poderá lhe ajudar:

    Use ProjetoDWQueimadas
    Go
    
    -- Exemplo 1 -- Criando um Pivot para Estados Específicos --
    Select P.Para, P.[Mato Grosso] 
    From 
     (Select Estado From Queimadas) As A
      Pivot (Count(A.Estado) For A.Estado In ([Para],[Mato Grosso])) As P
    Go
    
    -- Exemplo 2 -- Criando um Pivot com Total Parcial e Total Por Estados Específicos --
    Select  P.Para,
    			P.[Mato Grosso],
                'Total Parcial'=(Select Count(CodigoQueimada) From Queimadas Where Estado In ('Para', 'Mato Grosso'))
    From 
     (Select Estado From Queimadas) As A
      Pivot (Count(A.Estado) For A.Estado In ([Para],[Mato Grosso])) As P
    Group By Para, [Mato Grosso]
    Go
    
    
    -- Exemplo 3 -- Criando um Pivot Table Dinâmico com a soma de Queimadas em todos os Estados --
    
    -- Declarando as Variáveis de Controle --
    Declare @Estados Varchar(400), @ComandoEstados NVarchar(500)
    
    -- Transformando a linhas de Estados através da função String_Agg() em uma única Linha --
    ;With CTEEstados
    As
    (Select Distinct Estado From Queimadas1999
     Where Estado <> ''
     )
    Select @Estados='['+STRING_AGG(Estado,'], [')+']' From CTEEstados
    
    -- Gerando o Pivot Table com base na Lista de Estados armazenados na variável @Estados --
    Set @ComandoEstados= 'Select * From (Select Estado from Queimadas1999) As A Pivot (Count(A.Estado) For A.Estado In ('+@Estados+')) As P'
    
    -- Executando a Query Dinâmica utilizando o comando Exec ou SP_ExecuteSQL --
    Exec(@ComandoEstados)
    
    Execute SP_ExecuteSQL @ComandoEstados
    Go
    
    -- Exemplo 4 -- Criando um Pivot Table Dinâmico com a soma de Queimadas ocorridas em 1000 marcações de Data e Hora --
    
    -- Declarando as Variáveis de Controle --
    Declare @Data Varchar(Max), @ComandoData Varchar(Max)
    
    -- Transformando a linhas de DataHora através da função Stuff() em uma única Linha --
    Set @Data= Stuff((SELECT Distinct Top 1000 ',' + QuoteName(Convert(Varchar(20),DataHora,120)) from Queimadas1999 for XML PATH('')),1,1,'')
    
    -- Gerando o Pivot Table com base na Lista de Datas armazenados na variável @Data --
    Set @ComandoData= 'Select * From (Select DataHora from Queimadas1999) As A Pivot (Count(A.DataHora) For A.DataHora In ('+@Data+')) As P'
    
    -- Executando a Query Dinâmica utilizando o comando Exec --
    Exec(@ComandoData)
    Go
    
    -- Exemplo 5 -- Criando um Pivot Dinâmico com a soma de Queimadas ocorridas em 250 Município --
    
    -- Declarando as Variáveis de Controle --
    Declare @Municipio NVarchar(4000), @ComandoMunicipio Varchar(5000)
    
    -- Transformando a linhas de Municípios através da função Stuff() em uma única Linha --
    Set @Municipio= Stuff((SELECT Distinct Top 250 ',' + QuoteName(Municipio)  from Queimadas1999 Order By ',' + QuoteName(Municipio) Asc for XML PATH('')),1,1,'')
    
    -- Gerando o Pivot Table com base na Lista de Municípios armazenados na variável @Municipio --
    Set @ComandoMunicipio= 'Select * From (Select Municipio from Queimadas1999) As A Pivot (Count(A.Municipio) For A.Municipio In ('+@Municipio+')) As P'
    
    -- Executando a Query Dinâmica utilizando o comando Execute --
    Execute(@ComandoMunicipio)
    Go
    
    -- Exemplo 6 -- Criando um Pivot Dinâmico com a Total Geral de Queimadas ocorridas por Bioma e Total por Bioma --
    
    -- Declarando as Variáveis de Controle --
    Declare @Bioma Varchar(75), @ComandoBioma NVarchar(300)
    
    -- Transformando a linhas de Municípios através da função String_Agg() em uma única Linha --
    ;With CTEBioma
    As
    (Select Distinct Bioma From Queimadas1999)
    Select @Bioma='['+STRING_AGG(Bioma,'], [')+']' From CTEBioma
    
    -- Gerando o Pivot Table com base na Lista de Biomas armazenados na variável @Bioma --
    Set @ComandoBioma= 'Select *, ''Total Geral''=(Select Count(Bioma) From Queimadas1999)  From (Select Bioma from Queimadas1999) As A Pivot (Count(A.Bioma) For A.Bioma In ('+@Bioma+')) As P'
    
    -- Executando a Query Dinâmica utilizando o comando Execute SP_ExecuteSQL --
    Execute SP_ExecuteSQL @ComandoBioma
    Go

    No meu blog, você poderá encontrar estes e diversos outros exemplos para se fazer uso do operador Pivot, acesse: pedrogalvaojunior.wordpress.com


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 21 de setembro de 2021 00:10