none
Caso não exista o lançamento trazer um linha valor zero RRS feed

  • Pergunta

  • Olá pessoal do fórum,

    Estou elaborando um select em eventos lançados em uma tabela financeira "PFFINANC" onde preciso trazer uma listagem dos lançamento ordenadas mês e ano... Onde haverá casos que um determinado mês não houve lançamento, sendo assim teria que trazer um linha com apenas as colunas ANO e MES preenchida e a coluna VALOR zerada 0.00.

    Select atual:

    SELECT    
        F.CHAPA,
        F.NOME,
        FF.CODEVENTO,
        E.DESCRICAO AS EVENTO,
        FF.ANOCOMP AS ANO,
        FF.MESCOMP AS MES,
        FF.DTPAGTO AS DATA_PAGAMENTO,
        FF.VALOR
    FROM
        PEVENTO E
        LEFT JOIN PFFINANC FF ON E.CODIGO = FF.CODEVENTO
        INNER JOIN PFUNC F ON FF.CHAPA = F.CHAPA
        
    WHERE E.CODIGO IN ('1083','1096', '1089', '1019', '1166')
    AND FF.MESCOMP IN(1,2,3,4,5,6,7,8,9) AND FF.ANOCOMP = 2022

    Veja o resultado que os meses 2 e 6 não tiveram lançamentos então não são listados:

     Preciso trazer uma linha com um valor zerado representando esse meses dessa forma:


    quinta-feira, 29 de setembro de 2022 18:44

Respostas

  • Boa tarde,

    Segue uma sugestão para testes utilizando o Values para construir uma tabela com todos os meses:

    WITH CTE_LCTOS AS
    (
        SELECT    
            F.CHAPA,
            F.NOME,
            FF.CODEVENTO,
            E.DESCRICAO AS EVENTO,
            FF.ANOCOMP AS ANO,
            FF.MESCOMP AS MES,
            FF.DTPAGTO AS DATA_PAGAMENTO,
            FF.VALOR
        FROM
            PEVENTO E
            LEFT JOIN PFFINANC FF ON E.CODIGO = FF.CODEVENTO
            INNER JOIN PFUNC F ON FF.CHAPA = F.CHAPA
        
        WHERE E.CODIGO IN ('1083','1096', '1089', '1019', '1166')
        AND FF.MESCOMP IN(1,2,3,4,5,6,7,8,9) AND FF.ANOCOMP = 2022
    )
    
    SELECT    
        CHAPA,
        NOME,
        CODEVENTO,
        EVENTO,
        ANO,
        MES,
        DATA_PAGAMENTO,
        VALOR
    FROM CTE_LCTOS
    
    UNION
    
    SELECT
        NULL,
        NULL,
        NULL,
        NULL,
        M.MES,
        M.ANO,
        NULL,
        NULL
    FROM 
        ( values 
            (1, 2022), 
            (2, 2022), 
            (3, 2022),
            (4, 2022),
            (5, 2022),
            (6, 2022),
            (7, 2022),
            (8, 2022),
            (9, 2022)
        ) as M (MES, ANO)
    WHERE
        NOT EXISTS 
            (SELECT 1 FROM CTE_LCTOS AS L 
             WHERE L.MES = M.MES AND L.ANO = M.ANO)
    
    ORDER BY
        ANO,
        MES
    

    Espero que ajude


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

    quinta-feira, 29 de setembro de 2022 19:38

Todas as Respostas

  • Boa tarde,

    Segue uma sugestão para testes utilizando o Values para construir uma tabela com todos os meses:

    WITH CTE_LCTOS AS
    (
        SELECT    
            F.CHAPA,
            F.NOME,
            FF.CODEVENTO,
            E.DESCRICAO AS EVENTO,
            FF.ANOCOMP AS ANO,
            FF.MESCOMP AS MES,
            FF.DTPAGTO AS DATA_PAGAMENTO,
            FF.VALOR
        FROM
            PEVENTO E
            LEFT JOIN PFFINANC FF ON E.CODIGO = FF.CODEVENTO
            INNER JOIN PFUNC F ON FF.CHAPA = F.CHAPA
        
        WHERE E.CODIGO IN ('1083','1096', '1089', '1019', '1166')
        AND FF.MESCOMP IN(1,2,3,4,5,6,7,8,9) AND FF.ANOCOMP = 2022
    )
    
    SELECT    
        CHAPA,
        NOME,
        CODEVENTO,
        EVENTO,
        ANO,
        MES,
        DATA_PAGAMENTO,
        VALOR
    FROM CTE_LCTOS
    
    UNION
    
    SELECT
        NULL,
        NULL,
        NULL,
        NULL,
        M.MES,
        M.ANO,
        NULL,
        NULL
    FROM 
        ( values 
            (1, 2022), 
            (2, 2022), 
            (3, 2022),
            (4, 2022),
            (5, 2022),
            (6, 2022),
            (7, 2022),
            (8, 2022),
            (9, 2022)
        ) as M (MES, ANO)
    WHERE
        NOT EXISTS 
            (SELECT 1 FROM CTE_LCTOS AS L 
             WHERE L.MES = M.MES AND L.ANO = M.ANO)
    
    ORDER BY
        ANO,
        MES
    

    Espero que ajude


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

    quinta-feira, 29 de setembro de 2022 19:38
  • Perfeito, só adicionei o valor 0.00 em values! 

    WITH CTE_LCTOS AS
    (
        SELECT    
            F.CHAPA,
            F.NOME,
            FF.CODEVENTO,
            E.DESCRICAO AS EVENTO,
            FF.ANOCOMP AS ANO,
            FF.MESCOMP AS MES,
            FF.DTPAGTO AS DATA_PAGAMENTO,
            FF.VALOR
        FROM
            PEVENTO E
            LEFT JOIN PFFINANC FF ON E.CODIGO = FF.CODEVENTO
            INNER JOIN PFUNC F ON FF.CHAPA = F.CHAPA
        
        WHERE E.CODIGO IN ('1083','1096', '1089', '1019', '1166')
        AND FF.MESCOMP IN(1,2,3,4,5,6,7,8,9) AND FF.ANOCOMP = 2022
    )
    
    SELECT    
        CHAPA,
        NOME,
        CODEVENTO,
        EVENTO,
        ANO,
        MES,
        DATA_PAGAMENTO,
        VALOR
    FROM CTE_LCTOS
    
    UNION
    
    SELECT
        NULL,
        NULL,
        NULL,
        NULL,    
        M.ANO,
    	M.MES,
        NULL,
        M.VALOR
    FROM 
        ( values 
            (1, 2022, 0.00), 
            (2, 2022, 0.00), 
            (3, 2022, 0.00),
            (4, 2022, 0.00),
            (5, 2022, 0.00),
            (6, 2022, 0.00),
            (7, 2022, 0.00),
            (8, 2022, 0.00),
            (9, 2022, 0.00)
        ) as M (MES, ANO, VALOR)
    WHERE
        NOT EXISTS 
            (SELECT 1 FROM CTE_LCTOS AS L 
             WHERE L.MES = M.MES AND L.ANO = M.ANO)
    
    ORDER BY
        ANO,
        MES

    Obrigado!

    quinta-feira, 29 de setembro de 2022 20:34