Como escrever um SQL para atingir a seção "objetivo"? Selecione a taxa para todos os módulos selecionados e anos selecionados, independentemente de terem ou não taxa naquele ano.
Os anos e módulos serão inseridos pelos usuários, então o SQL retornará a taxa de soma para os anos e módulos selecionados.
Por exemplo, encontre a taxa para os módulos ASD, EB, GOF de 2008 a 2012, como acima
WITH finanimpact
AS (SELECT Extract(YEAR FROM fiwm.create_dt) AS years,
m.code AS mcode,
SUM(fiwm.rate) AS rate
FROM master.financial_impact_wfins_mapping fiwm
inner join master.wf_instance wf
ON wf.sysid = fiwm.wf_instance
AND wf.template_id = 4
inner join master.wf_data_cr wdc
ON wdc.instance_id = fiwm.wf_instance
inner join parameter.module m
ON m.sysid = wdc.module
AND m.sysid IN ( 4, 15, 6 )
GROUP BY Extract(YEAR FROM fiwm.create_dt),
m.code
UNION
(SELECT NULL,
m1.code,
0
FROM parameter.module m1
WHERE m1.sysid IN ( 4, 15, 6 )
MINUS
SELECT NULL,
m.code AS mcode,
0
FROM master.financial_impact_wfins_mapping fiwm
inner join master.wf_instance wf
ON wf.sysid = fiwm.wf_instance
AND wf.template_id = 4
inner join master.wf_data_cr wdc
ON wdc.instance_id = fiwm.wf_instance
inner join parameter.module m
ON m.sysid = wdc.module
AND m.sysid IN ( 4, 15, 6 )
GROUP BY Extract(YEAR FROM fiwm.create_dt),
m.code)) SELECT fi.years,
fi.mcode,
fi.rate
FROM finanimpact fi
UNION
(SELECT LEVEL + 2008 - 1,
'',
0 AS id
FROM dual
CONNECT BY LEVEL <= 2012 - 2008 + 1
MINUS
(SELECT DISTINCT lfi.years,
'',
0
FROM finanimpact lfi))
returned result:
=========================
2008 null 0
2009 null 0
2010 EB 34640
2010 GOF 8660
2011 EB 103920
2011 GOF 12990
2012 null 0
null ASD 0
=========================
goal:
=========================
2008 ASD 0
2009 ASD 0
2010 EB 34640
2010 GOF 8660
2011 EB 103920
2011 GOF 12990
2012 ASD 0
=========================
Isso parece uma questão de lição de casa que está investigando o quão bem você entende as junções externas e talvez a função NVL (em vez das equijunções que você possui atualmente).