none
Dúvida Query Sql RRS feed

  • Pergunta

  • Pessoal estou com dificuldades em aplicar um filtro na minha Select, preciso trazer todos os campos listados onde o valor líquido seja maior que 0 segue o código

    SELECT
    cred.cred_id,
    cred.nome,
    cred.diafechamento1,
    cred.vencimento1,
    cred.CORRENTISTA,
    cred.cgc,
    cred.COMISSAO,
    cred.CONTACORRENTE,
    cred.AGENCIA,
    cc.BAIXA_CREDENCIADO AS BAIXADO, 
    cred.BANCO as CODBANCO,ba.BANCO AS NOME_BANCO,
    
    COALESCE(SUM(CC.DEBITO - CC.CREDITO),0) AS BRUTO,
    
    (SELECT COALESCE(SUM(t.valor),0)FROM TAXAS t, rel_taxa_cred rtc 
    WHERE t.taxa_id = rtc.TAXA_ID and rtc.cred_id = cred.CRED_ID) aS TAXA_EXTRA,
    
    (coalesce((sum(CC.debito - CC.credito))*(cred.COMISSAO/100),0)) as COMISSAO_ADM,
    
    (coalesce(((sum(CC.debito - CC.credito))*(cred.COMISSAO/100))+
    (SELECT COALESCE(SUM(t.valor),0)
    FROM TAXAS t, rel_taxa_cred rtc 
    WHERE t.taxa_id = rtc.TAXA_ID and rtc.cred_id = cred.CRED_ID)
    /*taxas extras*/ ,0))AS TOTAL_RETIDO_ADM,
    
    ((COALESCE(SUM(CC.DEBITO - CC.CREDITO),0))-
    ((coalesce((sum(CC.debito - CC.credito))*(cred.COMISSAO/100),0))+
    (SELECT COALESCE(SUM(t.valor),0)FROM TAXAS t, rel_taxa_cred rtc 
    WHERE t.taxa_id = rtc.TAXA_ID and rtc.cred_id = cred.CRED_ID))) AS LIQUIDO, 
    
    'N' as ATRASADO 
    ---------------------------------------------------------------------------
    from credenciados cred 
    LEFT JOIN contacorrente cc  ON CC.CRED_ID = cred.CRED_ID 
    AND cc.data between '05/01/2015' and '11/01/2015' 
    AND cc.BAIXA_CREDENCIADO = 'N' 
    LEFT JOIN BANCOS ba ON ba.codigo = cred.banco 
    WHERE PAGA_CRED_POR_ID = 2 and cred.apagado = 'N' 
    
    --PROBLEMA AQUI PARA APLICAR ESTE FILTRO-- 
    AND 
    (
    	(COALESCE(SUM(CC.DEBITO - CC.CREDITO),0))
    	-
    	(
    		(COALESCE((sum(CC.debito - CC.credito))*(cred.COMISSAO/100),0))+
    		(SELECT COALESCE(SUM(t.valor),0)FROM TAXAS t, rel_taxa_cred rtc 
    		WHERE t.taxa_id = rtc.TAXA_ID and rtc.cred_id = cred.CRED_ID)
    	)
    ) > 0
    
    
    GROUP BY cred.CRED_ID,
    cc.BAIXA_CREDENCIADO,
    CRED.NOME,
    cred.diafechamento1,
    cred.vencimento1,
    cred.CORRENTISTA,
    cred.cgc, 
    cred.CONTACORRENTE, 
    cred.AGENCIA,
    ba.BANCO,
    cred.COMISSAO,
    cred.BANCO
    


    quinta-feira, 8 de janeiro de 2015 10:39

Respostas

Todas as Respostas

  • Basta você usar a mesma lógica para calcular o valor líquido, só que na cláusula where.

    where ((COALESCE(SUM(CC.DEBITO - CC.CREDITO),0))-
    ((coalesce((sum(CC.debito - CC.credito))*(cred.COMISSAO/100),0))+
    (SELECT COALESCE(SUM(t.valor),0)FROM TAXAS t, rel_taxa_cred rtc 
    WHERE t.taxa_id = rtc.TAXA_ID and rtc.cred_id = cred.CRED_ID))) > 0

    Porém, considerando performance, isso pode não ser muito bom. Seria melhor você criar uma tabela temporária #taxa e nela trazer todo o necessário para fazer o cálculo e utilizar, tanto na coluna (que traz o dado) quanto na cláusula where.

    quinta-feira, 8 de janeiro de 2015 11:34
  • Bom dia,

    Sidnei, acredito que uma alternativa seja o uso de uma CTE. Ex:

    with CTE_Tot as
    (
        -- sua query sem aquela condição
    )
    
    select * from CTE_Tot
    where Liquido > 0

    Espero que ajude.


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

    quinta-feira, 8 de janeiro de 2015 11:40
  • Pessoal acabei optando por usar a CTE.. vlw pela dica
    quinta-feira, 8 de janeiro de 2015 13:09
  • Basta você usar a mesma lógica para calcular o valor líquido, só que na cláusula where.

    where ((COALESCE(SUM(CC.DEBITO - CC.CREDITO),0))-
    ((coalesce((sum(CC.debito - CC.credito))*(cred.COMISSAO/100),0))+
    (SELECT COALESCE(SUM(t.valor),0)FROM TAXAS t, rel_taxa_cred rtc 
    WHERE t.taxa_id = rtc.TAXA_ID and rtc.cred_id = cred.CRED_ID))) > 0

    Porém, considerando performance, isso pode não ser muito bom. Seria melhor você criar uma tabela temporária #taxa e nela trazer todo o necessário para fazer o cálculo e utilizar, tanto na coluna (que traz o dado) quanto na cláusula where.

    Raphael,

    Concordo com você!!! Temos que ter muito cuidado quando em nossa claúsula Where fazemos uso de funções de conversão, agregação e também alguns operadores como por exemplo o Between.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    sexta-feira, 9 de janeiro de 2015 12:26