› Fóruns › SQL e PL/SQL › Select › Select
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;