首页 > 解决方案 > 在 Join 中使用一个表,其中一个表包含过去三个月的所有日期 - Oracle

问题描述

我有一张表,如下所示:

Date          Sales_Quantity
 1-JAN-2021      4
 5-JAN-2021      5
15-FEB-2021     10
31-MAR-2021     11

我想要的是生成一份报告31-MAR-2021,在左侧显示过去三个月的所有日期,以及任何没有销售显示为零的日期。

结果应如下所示:

1-JAN-2021,4
2-JAN-2021,0
3-JAN-2021,0
4-JAN-2021,0
5-JAN-2021,5
6-JAN-2021,0
...
...
30-MAR-2021,0
31-MAR-2021,11

我猜我可以通过左外连接来实现这一点,但是如何获得一个包含过去 3 个月所有日期的左表?

任何帮助将不胜感激。谢谢你。

标签: sqloraclejoin

解决方案


您已有的数据:

SQL> select * From test;

DATUM       SALES_QUANTITY
----------- --------------
01-jan-2021              4
05-jan-2021              5
15-feb-2021             10

使用 CTE,我正在为今年创建一个日历(sysdate这样说;您可以为任何一年或您想要的任意年创建它)并将其外部连接到test表中。

SQL> with calendar as
  2    (select trunc(sysdate, 'yyyy') + level - 1 datum
  3     from dual
  4     connect by level <= add_months(trunc(sysdate, 'yyyy'), 12) -
  5                         trunc(sysdate, 'yyyy')
  6    )
  7  select c.datum,
  8         nvl(t.sales_quantity, 0) sales_quantity
  9  from calendar c left join test t on t.datum = c.datum
 10  order by c.datum;

DATUM       SALES_QUANTITY
----------- --------------
01-jan-2021              4
02-jan-2021              0
03-jan-2021              0
04-jan-2021              0
05-jan-2021              5
06-jan-2021              0
07-jan-2021              0
08-jan-2021              0
09-jan-2021              0
10-jan-2021              0
11-jan-2021              0
<snip>

推荐阅读