Como montar essa SQL?

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Boa tarde, tenho uma dúvida em relação a montagem de uma SQL para exibir o seguinte relatório.

Loja - Todos os Dados - A Vista - Contratos - Pedidos Anteriores - Pedidos Atuais - Diferença
L01 - 2525,00 - 25,00 - 2500,00 - 0,00 - 0,00 - 0,00
L02 - 1300,00 - 0,00 - 1325,00 - 25,00 - 0,00 - 0,00


Algumas particularidades:

1 - Os A vista e Contratos são apenas os faturados do mês informado
2 - Todos os dados não faz diferença entre os faturados e não faturados
3 - Pedidos Anteriores: São os vendidos no mês anterior e faturados no mês atual
4 - Pedidos Atuais: São os faturados e vendidos no mês atual
5 - A diferença é calculada da seguinte forma:
(A Vista + Contratados) - Todos - Pedidos Anteriores + Pedidos Atuais

Cheguei na seguinte conclusão:

Selecionar tudo

select C.LOJA,
       nvl(sum(C.VlrCurso), 0) Oracle,
       nvl((SELECT SUM(VLRCURSO)
             FROM CYBELAR_CRESCABR
            WHERE FATURADO = 'S'
              AND TO_CHAR(DTVENDA, 'MM/YYYY') = '10/2009'
              AND LENGTH(CONTRATO) < 9
              AND C.LOJA = LOJA
            GROUP BY LOJA),
           0) VV,
       nvl((SELECT SUM(VLRCURSO)
             FROM CYBELAR_CRESCABR
            WHERE FATURADO = 'S'
              AND TO_CHAR(DTVENDA, 'MM/YYYY') = '10/2009'
              AND LENGTH(CONTRATO) >= 9
              AND C.LOJA = LOJA
            GROUP BY LOJA),
           0) CONTRATOS,
       nvl((SELECT SUM(VLRCURSO)
             FROM CYBELAR_CRESCABR
            WHERE FATURADO = 'N'
              AND TO_CHAR(DTVENDA, 'MM/YYYY') = '09/2009'
              AND C.LOJA = LOJA
            GROUP BY LOJA),
           0) PEDIDOS_ANTIGOS,
       nvl((SELECT SUM(VLRCURSO)
             FROM CYBELAR_CRESCABR
            WHERE FATURADO = 'N'
              AND TO_CHAR(DTVENDA, 'MM/YYYY') = '10/2009'
              AND C.LOJA = LOJA
            GROUP BY LOJA),
           0) PEDIDOS_ATUAIS,
       (((SELECT SUM(VLRCURSO)
            FROM CYBELAR_CRESCABR
           WHERE FATURADO = 'S'
             AND TO_CHAR(DTVENDA, 'MM/YYYY') = '10/2009'
             AND LENGTH(CONTRATO) < 9
             AND C.LOJA = LOJA
           GROUP BY LOJA) +
       (SELECT SUM(VLRCURSO)
            FROM CYBELAR_CRESCABR
           WHERE FATURADO = 'S'
             AND TO_CHAR(DTVENDA, 'MM/YYYY') = '10/2009'
             AND LENGTH(CONTRATO) >= 9
             AND C.LOJA = LOJA
           GROUP BY LOJA)) - SUM(C.VLRCURSO) -
       (SELECT SUM(VLRCURSO)
           FROM CYBELAR_CRESCABR
          WHERE FATURADO = 'N'
            AND TO_CHAR(DTVENDA, 'MM/YYYY') = '09/2009'
            AND C.LOJA = LOJA
          GROUP BY LOJA) + (SELECT SUM(VLRCURSO)
                               FROM CYBELAR_CRESCABR
                              WHERE FATURADO = 'N'
                                AND TO_CHAR(DTVENDA, 'MM/YYYY') = '10/2009'
                                AND C.LOJA = LOJA
                              GROUP BY LOJA)) CONFERENCIA
  from cybelar_crescabr C
 where Faturado = 'S'
   and to_char(dtvenda, 'MM/yyyy') = '10/2009'
 group by Loja
 ORDER BY LOJA
Mas acredito que tenha uma forma mais fácil de se fazer.
alguém poderia me dar uma luz?
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

À primeira vista, sem muita análise, você pode utilizar o comando WITH e eliminar todas estas subquerys repetidas.
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

cheguei nessa conclusão, mas na hora que executa fica num loop, onde está o erro?

Selecionar tudo

with 
  Sum_Oracle as
    (select Nvl(sum(VlrCurso), 0) Oracle from Cybelar_Crescabr
       where Faturado = 'S'
         and DtVenda Between To_Date('01/10/2009', 'DD/MM/YYYY')
         and Last_Day(To_Date('01/10/2009', 'DD/MM/YYYY'))
         Group by Loja),
  Sum_VV as 
    (Select Nvl(Sum(VlrCurso), 0) VV from Cybelar_Crescabr
       where Faturado = 'S'
         and DtVenda Between To_Date('01/10/2009', 'DD/MM/YYYY')
         and Last_Day(To_Date('01/10/2009', 'DD/MM/YYYY'))
         and Length(Contrato) < 9
         Group by Loja), 
  Sum_Contratos as 
    (Select Nvl(Sum(VlrCurso), 0) Contratos from Cybelar_Crescabr
       where Faturado = 'S'
         and DtVenda Between To_Date('01/10/2009', 'DD/MM/YYYY')
         and Last_Day(To_Date('01/10/2009', 'DD/MM/YYYY'))
         and Length(Contrato) >= 9
         Group by Loja),
  Sum_Anterior as 
    (Select Nvl(Sum(VlrCurso), 0) PedAnt from Cybelar_Crescabr
       where Faturado = 'S'
         and DtVenda Between To_Date('01/09/2009', 'DD/MM/YYYY')
         and Last_Day(To_Date('01/09/2009', 'DD/MM/YYYY'))        
         Group by Loja), 
  Sum_Atual as 
    (Select Nvl(Sum(VlrCurso), 0) PedAtual from Cybelar_Crescabr
       where Faturado = 'S'
         and DtVenda Between To_Date('01/10/2009', 'DD/MM/YYYY')
         and Last_Day(To_Date('01/10/2009', 'DD/MM/YYYY'))
         Group by Loja),
  Df_Diferenca as 
    ( Select (Sum_VV.VV + Sum_Contratos.Contratos) - Sum_Oracle.Oracle - Sum_Anterior.PedAnt + Sum_Atual.PedAtual
        from Sum_VV, Sum_Contratos, Sum_Oracle, Sum_Anterior, Sum_Atual)
  Select Loja
    from Cybelar_Crescabr,
         Sum_Oracle,
         Sum_VV,
         Sum_Contratos,
         Sum_Anterior,
         Sum_Atual,
         Df_Diferenca
     where Faturado = 'S'
       and DtVenda between To_Date('01/10/2009', 'DD/MM/YYYY') 
       and Last_Day(To_Date('01/10/2009', 'DD/MM/YYYY'))
     group by Loja
     Order by Loja
[/code]
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante