Pular para o conteúdo

Fóruns SQL e PL/SQL Como montar essa SQL? Como montar essa SQL?

#91773
burga
Participante

    [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)