Pular para o conteúdo

Fóruns SQL e PL/SQL Select Select

#96033
burga
Participante

    Dê uma olhada nisto, coloquei a tabela que filtra os ultimos dias uteis dos meses dentro de uma cláusula with, e utilizei esse filtro dentro da subconsulta que calcula a rentabilidade e no WHERE da consulta principal
    Isso pra pegar somente o valor do ultimo dia útil do mês da cotação e do mês anterior, também trunquei todas as datas, pra garantir que as horas não influenciem nos filtros.

    Como não tenho as tabelas não posso testar, então isso fica por sua conta… 😆

    Também retirei o MAX da subconsulta, depois você repõe ele.

    WITH t1 AS (
    SELECT MAX(RET_DATA) ultimo_dia_util_mes
    FROM
    (SELECT to_date(trunc(ZT.data_entrada))+level-1 RET_DATA
    FROM zxt_cal_rentabilidade ZT
    CONNECT BY to_date(trunc(ZT.data_entrada))+level-1 <= last_day(to_date(trunc(ZT.data_final)))
    MINUS
    SELECT trunc(FI.data)
    FROM feriados_internacionais FI
    WHERE cod_calendario = '-1316'
    )
    GROUP BY TO_CHAR(RET_DATA,'MM/YYYY')
    )
    SELECT zx.nome_cliente,
    zx.nome_do_fundo,
    co.data,
    co.valor ,
    (SELECT (co.valor/x.valor) -1
    FROM cotacoes x
    WHERE TRUNC(add_months(co.data,-1),'MM') = TRUNC(x.data,'MM')
    AND co.cod_produto = x.cod_produto
    AND EXISTS (SELECT 1 FROM t1 WHERE TRUNC(x.data) = ultimo_dia_util_mes)
    )"Rentabilidade"
    FROM cotacoes CO,
    zxt_cal_rentabilidade ZX
    WHERE zx.nome_cliente = (:nome)
    AND co.cod_produto = zx.cod_produto
    AND EXISTS (SELECT 1 FROM t1 WHERE TRUNC(co.data) = ultimo_dia_util_mes)
    ORDER BY zx.nome_do_fundo, co.data;