您可以使用partitioned outer join这一点,这将消除交叉连接。
感谢@Wolf为SQL Fiddle
查询1:
with
-- Your sample data
sample_data as (
select 'Rate1' NewRate, 'Rate2' OldRate, to_date(8, 'MM') Month, 1 Count from dual union all
select 'Rate1', 'Rate3', to_date(2, 'MM'), 3 from dual union all
select 'Rate1', 'Rate3', to_date(3, 'MM'), 2 from dual union all
select 'Rate1', 'Rate3', to_date(7, 'MM'), 2 from dual union all
select 'Rate1', 'Rate3', to_date(8, 'MM'), 12 from dual union all
select 'Rate3', 'Rate1', to_date(1, 'MM'), 1 from dual union all
select 'Rate3', 'Rate1', to_date(2, 'MM'), 1 from dual union all
select 'Rate3', 'Rate1', to_date(5, 'MM'), 1 from dual union all
select 'Rate3', 'Rate1', to_date(7, 'MM'), 3 from dual union all
select 'Rate3', 'Rate1', to_date(8, 'MM'), 9 from dual),
-- Using the "with clause" we can generate a set of months as rows
dense_months as (
select to_date(level, 'MM') mo
from dual
connect by level <=12)
select
sd.newrate, sd.oldrate, dm.mo, nvl(sd.count,0) count
from sample_data sd
partition by (sd.newrate, sd.oldrate)
right outer join dense_months dm
on dm.mo = sd.month
order by 1, 2, 3
Results:
| NEWRATE | OLDRATE | MO | COUNT |
|---------|---------|-----------------------------|-------|
| Rate1 | Rate2 | January, 01 2015 00:00:00 | 0 |
| Rate1 | Rate2 | February, 01 2015 00:00:00 | 0 |
| Rate1 | Rate2 | March, 01 2015 00:00:00 | 0 |
| Rate1 | Rate2 | April, 01 2015 00:00:00 | 0 |
| Rate1 | Rate2 | May, 01 2015 00:00:00 | 0 |
| Rate1 | Rate2 | June, 01 2015 00:00:00 | 0 |
| Rate1 | Rate2 | July, 01 2015 00:00:00 | 0 |
| Rate1 | Rate2 | August, 01 2015 00:00:00 | 1 |
| Rate1 | Rate2 | September, 01 2015 00:00:00 | 0 |
| Rate1 | Rate2 | October, 01 2015 00:00:00 | 0 |
| Rate1 | Rate2 | November, 01 2015 00:00:00 | 0 |
| Rate1 | Rate2 | December, 01 2015 00:00:00 | 0 |
| Rate1 | Rate3 | January, 01 2015 00:00:00 | 0 |
| Rate1 | Rate3 | February, 01 2015 00:00:00 | 3 |
| Rate1 | Rate3 | March, 01 2015 00:00:00 | 2 |
| Rate1 | Rate3 | April, 01 2015 00:00:00 | 0 |
| Rate1 | Rate3 | May, 01 2015 00:00:00 | 0 |
| Rate1 | Rate3 | June, 01 2015 00:00:00 | 0 |
| Rate1 | Rate3 | July, 01 2015 00:00:00 | 2 |
| Rate1 | Rate3 | August, 01 2015 00:00:00 | 12 |
| Rate1 | Rate3 | September, 01 2015 00:00:00 | 0 |
| Rate1 | Rate3 | October, 01 2015 00:00:00 | 0 |
| Rate1 | Rate3 | November, 01 2015 00:00:00 | 0 |
| Rate1 | Rate3 | December, 01 2015 00:00:00 | 0 |
| Rate3 | Rate1 | January, 01 2015 00:00:00 | 1 |
| Rate3 | Rate1 | February, 01 2015 00:00:00 | 1 |
| Rate3 | Rate1 | March, 01 2015 00:00:00 | 0 |
| Rate3 | Rate1 | April, 01 2015 00:00:00 | 0 |
| Rate3 | Rate1 | May, 01 2015 00:00:00 | 1 |
| Rate3 | Rate1 | June, 01 2015 00:00:00 | 0 |
| Rate3 | Rate1 | July, 01 2015 00:00:00 | 3 |
| Rate3 | Rate1 | August, 01 2015 00:00:00 | 9 |
| Rate3 | Rate1 | September, 01 2015 00:00:00 | 0 |
| Rate3 | Rate1 | October, 01 2015 00:00:00 | 0 |
| Rate3 | Rate1 | November, 01 2015 00:00:00 | 0 |
| Rate3 | Rate1 | December, 01 2015 00:00:00 | 0 |
我只是想调出并批准建议的'分区外连接',每@诺埃尔的答案在下面。这是一个很大的简化,坦率地说,当我写我的回复时(我可能很匆忙),我的思想开始滑落。 – Wolf