none
Mostrar o resultado da segunda condição somente se tiver a primeira RRS feed

  • Pergunta

  • Bom dia pessoal!

    Estou com uma dificuldade em como montar uma query com algumas condicionais e uma delas o resultado só vai aparecer se tiver a condição anterior. Vou tentar explicar abaixo:

    Tenho uma relação de débitos por empresa no período: 2014 a 2017

    Esses débitos são de dois tipos: 'SI' e 'AS'

    Preciso listar por empresa todos os débitos SI neste período e listar os débitos AS apenas das empresas que também tenha débitos SI neste período.

    Além disso tenho alguns critérios para colocar que são filtros para ambos os pagamentos, que são definições do tipo, processo, atividade, local e etc...

    Por favor, alguém pode me dar uma luz de como montar isso? Eu tentei usar CASE, IF, mas não consegui montar a lógica para o caso de débitos AS mostrar somente se também tiver débitos SI.

    SELECT

    DEB.EMPRESA AS Codigo_Empresa, CGC_CCM AS CNPJ,RAZ_SOC AS Razao_Social, EMP.QTD_SOC AS Socios, DEB.TIPO AS TIPO_Rec, DEBITO, COUNT(PARCELA) AS Parcelas_em_aberto, SUM(DEB.VL_DEB) AS Valor_Total_Debito, CONVERT(varchar, DT_PAGAMENTO, 105) AS Data_Ultimo_Pagamento, AR.CODIGO, AR.NOME, AT.COD_ATIV,AT.DESCRICAO

    FROM DEBITOS AS DEB
    INNER JOIN EMPRESAS AS EMP ON DEB.EMPRESA = EMP.EMPRESA
    LEFT JOIN AREA AR ON EMP.AREA_ADM = AR.CODIGO
    LEFT JOIN ATIVIDADE AT ON EMP.COD_ATIV = AT.COD_ATIV
    OUTER APPLY ( SELECT TOP 1 DT_PAGAMENTO, TOT_PAGO, TIPO FROM PAGAMENTOS AS PAG
                                   WHERE EMP.EMPRESA= PAG.EMPRESA  ORDER BY DT_PAGAMENTO DESC, RECNUM DESC) AS UltimoPagamento

    WHERE DEB.PROCESSO IN (' ','M') AND DEB.PASTA=0 AND DT_PAGAMENTO>'2010-01-01' AND AT.COD_ATIV IN (51,34,35,29,55,20,19,18,36,15,14,54,53,7,8,28,1,11,13,2,30,27,12,59,6,16,24,0,4,61,   60) AND

                                   ( CASE WHEN DEB.TIPO='S' AND DEB.DT_VENCTO BETWEEN '2014-01-01' AND '2017-12-31'                                                THEN DEB.DT_VENCTO >= '2013-08-01' AND '2017-12-31' and DEB.TIPO in ('A';'S')                                  END                              ) AS  DEBITO

    GROUP BY    DEB.EMPRESA,    CGC_CCM,    RAZ_SOC,    DEB.TIPO,    EMP.QTD_SOC,    DT_PAGAMENTO,    AR.CODIGO,    AR.NOME,    AT.COD_ATIV,    AT.DESCRICAO

       ORDER BY Codigo_Empresa

    Muito obrigada!!!

    Mariana

    quinta-feira, 14 de junho de 2018 13:24

Respostas

Todas as Respostas

  • Deleted
    quinta-feira, 14 de junho de 2018 15:07
  • ( CASE WHEN DEB.TIPO='SI' AND DEB.DT_VENCTO BETWEEN '2014-01-01' AND '2017-12-31'                                      
    THEN DEB.DT_VENCTO >= '2013-08-01' AND '2017-12-31' and DEB.TIPO in ('AS';'SI') 

    END                              ) AS  DEBITO

    Como se descobre que uma empresa está em débito? Desculpe, estava com os nomes errados. Os debitos são todos os registros que tiverem com AS e SI em TIPO.

    Como se identificam débitos do tipo SI e AS? Tem uma coluna na tabela chamada TIPO e lá está AS ou SI

    O que contêm as tabelas PAGAMENTOS e DEBITOS? Essas tabelas são bem semelhantes. Está assim:

    Empresa | Data Vencimento| Tipo| Ano| Parcela -Tabela Debitos
    321 | 01/01/2017 | AS| 2017 | 1

    Empresa | Data Vencimento| Tipo| Ano| Parcela -Tabela Pagamentos
    321 | 01/01/2017 | SI| 2017 | 1
    322 | 01/05/2017 | AS| 2017 | 5
    322 | 01/05/2017 | SI| 2017 | 5

    Obrigada!!!!

    quinta-feira, 14 de junho de 2018 15:52
  • Deleted
    quinta-feira, 14 de junho de 2018 16:05
  • Oi Jose! Desculpe passar só parte da informação, queria não escrever algo muito extenso e não me atentei a isso.  Funciona assim. Tenho uma tabela de Empresas com todos os dados da empresa, outra tabela que é alimentada somente com os Pagamentos e outra tabela somente com os Débitos. 

    As tabelas de Débitos e Pagamentos são bem parecidas, em todas elas eu tenho o código da empresa para se relacionarem. Então vou comentar os campos do meu SELECT para ver se consigo me explicar melhor...

    O que eu preciso é consultar os debitos num período e listar por empresa. E preciso que a relação seja feita assim, todos as empresas com débitos SI no período, a partir daí todas as empresas que tem débito AS, ou seja, os débitos AS da empresa só vão aparecer se tiver débito SI. Cada linha da tabela é um debito, contando pela Data de vencimento, Ano e Parcela, sendo assim, consigo contar quantos débitos a empresa tem pelo count(parcela). Na tabela de débitos é assim: Exemplo: Código da Empresa| Data Vencimento|Ano|Parcela|Valor Debito 322|01/11/2017|2017|11|R$300,00

    Não sei se consegui me fazer entender muito bem. 

    SELECT

    DEB.EMPRESA AS Codigo_Empresa, -- CÓDIGO DA EMPRESA (CHAVE PRIMÁRIA) DA TABELA DEBITOS EMP.CGC_CCM AS CNPJ, -- CNPJ DA EMPRESA DA TABELA EMPRESAS
    EMP.RAZ_SOC AS Razao_Social, --RAZAO SOCIAL DA TABELA EMPRESAS
    EMP.QTD_SOC AS Socios,
    --SOCIOS DA TABELA EMPRESA
    DEB.TIPO AS TIPO_Rec,
    --TIPO DE DEBITO DA TABELA DEBITOS
    DEBITO,  COUNT(DEB.PARCELA) AS Parcelas_em_aberto, 
    --QUANTIDADE DE PARCELAS EM ABERTO DA TABELA DEBITOS
    SUM(DEB.VL_DEB) AS Valor_Total_Debito, 
    --SOMA DE VALOR EM ABERTO DA TABELA DEBITOS CONVERT(varchar, DT_PAGAMENTO, 105) AS Data_Ultimo_Pagamento,  
    AR.NOME, 
    --NOME DA UNIDADE DA EMPRESA FILIAIS DA TABELA AREA AT.DESCRICAO--ATIVIDADE DA EMPRESA DA TABELA ATIVIDADE

    FROM DEBITOS AS DEB  INNER JOIN EMPRESAS AS EMP ON DEB.EMPRESA = EMP.EMPRESA  LEFT JOIN AREA AR ON EMP.AREA_ADM = AR.CODIGO  LEFT JOIN ATIVIDADE AT ON EMP.COD_ATIV = AT.COD_ATIV  OUTER APPLY ( SELECT TOP 1 DT_PAGAMENTO, TOT_PAGO, TIPO  FROM PAGAMENTOS AS PAG WHERE EMP.EMPRESA= PAG.EMPRESA ORDER BY DT_PAGAMENTO DESC, RECNUM DESC) AS UltimoPagamento

    WHERE DEB.PROCESSO IN (' ','M') AND DEB.PASTA=0 AND DT_PAGAMENTO>'2010-01-01' ANDAT.COD_ATIV IN (51,34,35,29,55,20,19,18,36,15,14,54,53,7,8,28,1,11,13,2,30,27,12,59,6,16,24,0,4,61,   60) AND

                  ( CASE WHEN DEB.TIPO='SI' AND DEB.DT_VENCTO BETWEEN '2014-01-01' AND '2017-12-31'                                            THEN DEB.DT_VENCTO >= '2013-08-01' AND '2017-12-31' and DEB.TIPO in ('AS';'SI')                          END                              ) AS  DEBITO

    GROUP BY    DEB.EMPRESA,    CNPJ,    RAZ_SOC,    DEB.TIPO,    EMP.QTD_SOC,    DT_PAGAMENTO,    AR.CODIGO,    AR.NOME,    AT.COD_ATIV,    AT.DESCRICAO

       ORDER BY Codigo_Empresa

    Muito obrigada!!!

    Mariana


    quinta-feira, 14 de junho de 2018 17:49
  • Boa tarde,

    Mariana, não consegui entender esse trecho do Case com essas datas, mas segue um script bem simplificado para testes que talvez possa ser adaptado para o seu caso:

    declare @Debitos table
    (Empresa int, Valor decimal(19, 2), Tipo varchar(10));
    
    insert into @Debitos values
    (1, 100, 'SI'),
    (1, 50, 'SI'),
    (1, 200, 'AS'),
    (2, 1, 'AS'),
    (2, 2, 'AS'),
    (3, 10, 'SI'),
    (3, 20, 'AS'),
    (4, 1000, 'SI');
    
    with CTE_Sum as
    (
        select
            Empresa,
            Tipo,
            sum(Valor) as Total,
            sum(case when Tipo = 'SI' then 1 else 0 end) over(partition by Empresa) as TemSI
        from @Debitos
        group by
            Empresa,
            Tipo
    )
    
    select 
        Empresa,
        Tipo,
        Total 
    from CTE_Sum
    where
        Tipo = 'SI' or
        TemSI = 1

    Espero que seja útil


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

    quinta-feira, 14 de junho de 2018 18:09
  • Deleted
    quinta-feira, 14 de junho de 2018 19:32
  • Boa tarde,

    Mariana, não consegui entender esse trecho do Case com essas datas, mas segue um script bem simplificado para testes que talvez possa ser adaptado para o seu caso:

    declare @Debitos table
    (Empresa int, Valor decimal(19, 2), Tipo varchar(10));
    
    insert into @Debitos values
    (1, 100, 'SI'),
    (1, 50, 'SI'),
    (1, 200, 'AS'),
    (2, 1, 'AS'),
    (2, 2, 'AS'),
    (3, 10, 'SI'),
    (3, 20, 'AS'),
    (4, 1000, 'SI');
    
    with CTE_Sum as
    (
        select
            Empresa,
            Tipo,
            sum(Valor) as Total,
            sum(case when Tipo = 'SI' then 1 else 0 end) over(partition by Empresa) as TemSI
        from @Debitos
        group by
            Empresa,
            Tipo
    )
    
    select 
        Empresa,
        Tipo,
        Total 
    from CTE_Sum
    where
        Tipo = 'SI' or
        TemSI = 1

    Espero que seja útil



    Muito obrigada pela resposta. Vou testar e incrementar o AS. :)
    sexta-feira, 15 de junho de 2018 12:33
  • (A) Ainda não entendi qual a função da tabela de débito: (1) ela registra parcelas em atraso OU (2) todas as parcelas são registradas nela, tendo ou não sido pagas?

    Quando uma parcela é paga, o que é registrado na tabela de débitos e o que é registrado na tabela de pagamentos?

    Resposta: Na tabela de débitos constam apenas os débitos, quando é feito um pagamento o débito sai da tabela de débitos e vai pra tabela de pagamentos.

    Tabela DÉBITOS
    CodigoEmpresa Data_Vencimento Ano PARCELA Valor_Debito
    12 10/06/2018 2017 12 603.50
    12 10/07/2018 2017 13 0.00
             
    Tabela PAGAMENTOS
    CodigoEmpresa Data_Vencimento Ano PARCELA Valor_Pagamento
    12 10/01/2018 2017 7 497.00
    12 10/02/2018 2017 8 532.50
    12 10/03/2018 2017 9 449.67
    12 10/04/2018 2017 10 461.50
    12 10/05/2018 2017 11

    461.50

    (B) Supondo que um cliente adquira o produto X, para pagar em 3 parcelas; o que é registrado nas tabelas DEBITOS e PAGAMENTOS:

    1. no momento da compra?
    2. no momento do pagamento da primeira parcela?
    3. se a segunda parcela não for paga até a data de vencimento?
    4. quando a segunda parcela, que estava atrasada, é paga?

    Resposta: Todos os débitos ficam na tabela de débitos até serem pagos. Cada registro da tabela de débitos é uma parcela

     (C) À medida que você fornece detalhes estou ampliando o código #1 postado lá no alto, ok?

    Resposta: Perfeito!! Muito, muito obrigada!

     (D) Qual o número aproximado de linhas da tabela DEBITOS para o período de 2014 a 2017?

    Resposta: Aproximadamente mais de 600 mil linhas




    • Editado Mariana.Sky sexta-feira, 15 de junho de 2018 12:37
    sexta-feira, 15 de junho de 2018 12:36
  • Deleted
    sexta-feira, 15 de junho de 2018 12:55
  • Oi José, obrigada! Vou testar agora. 

    Da tabela PAGAMENTOS só preciso saber o último pagamento registrado pela empresa mesmo. :)

    sexta-feira, 15 de junho de 2018 13:50
  • Deleted
    • Marcado como Resposta Mariana.Sky sexta-feira, 15 de junho de 2018 14:56
    sexta-feira, 15 de junho de 2018 14:04
  • José, perfeito, resolvido!!!

    Já deu super certo com código #1! Vou usar o código #2 também.

    Muito obrigada!!!! ;)

    sexta-feira, 15 de junho de 2018 14:56