none
SUBSELECT SEM O FROM RRS feed

  • Pergunta

  • Galera, boa tarde!

    Estou com esta query

    SELECT DISTINCT TOP 10
    DM01.DM001_010 AS CLIENTE, 
    DM22.DM022_010 AS SACADO, 
    ISNULL((SELECT SUM(FATO.OPFT001_110)WHERE DM62.DM062_000 IN (1,2) ),0) AS CARTEIRA,
    ISNULL((SELECT SUM(FATO.OPFT001_110) WHERE DM62.DM062_000 IN (1)),0) AS VENCER,
    ISNULL((SELECT SUM(FATO.OPFT001_110) 
    WHERE 
    DM62.DM062_000 IN (2)
    AND FX.sk_fx_pgto >= 1 --FAIXA DE PAGAMENTO FILTRADA
       )
    ,0)AS VENCIDO,

    ISNULL((SELECT SUM(FATO.OPFT001_110)  -- VALOR VENCIDO ATÉ 5 DIAS
    WHERE 
    DM62.DM062_000 IN (2)
    AND FX.sk_fx_pgto = 2
       )
    ,0)AS VCD_5_DIAS,

    ISNULL((SELECT SUM(FATO.OPFT001_110) --   VALOR VENCIDO ATÉ DE 6 A 15 DIAS
    WHERE 
    DM62.DM062_000 IN (2)
    AND FX.sk_fx_pgto = 3 
       )
    ,0)AS VCD_6_15_DIAS,

    ISNULL((SELECT SUM(FATO.OPFT001_110)  --   VALOR VENCIDO ATÉ DE 16 A 30 DIAS
    WHERE 
    DM62.DM062_000 IN (2)
    AND FX.sk_fx_pgto = 4 
       )
    ,0)AS VCD_16_30_DIAS,

    ISNULL((SELECT SUM(FATO.OPFT001_110)   --   VALOR VENCIDO ATÉ DE 31 A 60 DIAS
    WHERE 
    DM62.DM062_000 IN (2)
    AND FX.sk_fx_pgto = 5 
       )
    ,0)AS VCD_31_60_DIAS,

    ISNULL((SELECT SUM(FATO.OPFT001_110)    --   VALOR VENCIDO MAIS DE 60 DIAS
    WHERE 
    DM62.DM062_000 IN (2)
    AND FX.sk_fx_pgto = 6 
       )
    ,0)AS VCD_MAIS_60_DIAS

    FROM OPTBFT001 FATO
    INNER JOIN TCTBDM022 DM22 ON DM22.DM022_000 = FATO.DM022_000 ---SACADO
    INNER JOIN TCTBDM001 DM01 ON DM01.DM001_000 = FATO.DM001_000 ---CLIENTE
    INNER JOIN TCTBDM062 DM62 ON DM62.DM062_000 = FATO.DM062_000 ---SITUACAO DE PAGAMENTO
    INNER JOIN OPTBDM060 DM60 ON DM60.DM060_000 = FATO.DM099_000 ---TIPO DE LANÇAMENTO
    INNER JOIN TCTBDM023 DM23 ON DM23.DM023_000 = FATO.DM023_000 ---EMPRESA  
    INNER JOIN FNTBDM_FAIXA_PGTO FX ON FX.sk_fx_pgto = FATO.sk_faixa_pgto ---FAIXA DE PAGAMENTO

    WHERE 
    DM01.DM001_010 LIKE '%VITADERM%'
    AND FATO.DM099_000 IN(630,640,650,660)
    AND FATO.DM023_000 IN(1,2)
    AND DM62.DM062_000 NOT IN(3) --SOMENTE EM ABERTO, A VENCER E VENCIDO

    GROUP BY 
    DM01.DM001_010,
    DM22.DM022_010,
    DM62.DM062_000,
    FX.sk_fx_pgto


    Em vários retornos do subselect com o SUM estou usando a cláusula sem o FROM.

    E este forma a query está funcionando para mim, que eu apenas estou com um problema de agregação.

    Eu gostaria de saber se é viável usar este subselect da forma que eu usei. Ou se está errado, qual seria a melhor forma de usar....

    Abraço


    MCP Windows Server 2003

    quarta-feira, 15 de agosto de 2012 20:16

Respostas

  • Olá Vinícius..

    A forma que a consulta foi implementada não está errada, também trabalho dessa forma e não tenho problemas.

    Acho que a questão seria o plano de execução gerado pelo SQL Server para lhe retornar o resultado da consulta.

    Talvez, abstrair os subselects, gerando uma user function, seja uma melhor prática. Já que você faz o mesmo cálculo muitas vezes somente mudando alguns parâmetros.

    Espero ter lhe ajudado.


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    • Marcado como Resposta Harley Araujo sexta-feira, 17 de agosto de 2012 13:28
    quinta-feira, 16 de agosto de 2012 12:31