› Fóruns › SQL e PL/SQL › Como montar essa SQL? › Como montar essa SQL?
[quote=”facc”:1clykax5]Cheguei nisso, mas tá em um loop infinito… onde Errei?
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'))
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)
Select Loja
from Cybelar_Crescabr,
Sum_Oracle,
Sum_VV,
Sum_Contratos,
Sum_Anterior,
Sum_Atual
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
E como faço para trazer o resultado da diferença entre eles?[/quote]
Bom, primeiro que SUM_VV e SUM_CONTRATOS são exatamente iguais, você pode eliminar uma delas.
Depois, analisando o select principal
Select Loja
from Cybelar_Crescabr,
Sum_Oracle,
Sum_VV,
Sum_Contratos,
Sum_Anterior,
Sum_Atual
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
Você está fazendo um cross join de todas as “tabelas temporárias” com a tabela cybelar_crescabr.
O mais correto seria, nos selects das “tabelas temporárias”, você retornar também o codigo da loja pra fazer o join corretamente entre os registros no select principal.
E ainda, retornando o codigo da loja nos outros selects elimina a necessidade de usar a tabela cybelar_crescabr no select principal, pois você terá todos os dados de que necessita nas “tabelas temporárias”.
Mais, no select principal está faltando você imprimir os campos de que deseja (fazer a projeção), provenientes das “tabelas temporárias”.
Refaça o select com estas correções e veja se dá certo… 8)