在 Join 中使用一个表,其中一个表具有过去三个月的所有日期 - Oracle
Posted
技术标签:
【中文标题】在 Join 中使用一个表,其中一个表具有过去三个月的所有日期 - Oracle【英文标题】:Using a table in Join where one table has all the dates of last three months - Oracle 【发布时间】:2021-04-03 12:18:50 【问题描述】:我有一张表如下:
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 个月所有日期的左表?
我们将不胜感激任何帮助。谢谢。
【问题讨论】:
【参考方案1】:您已有的数据:
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>
【讨论】:
感谢您的帮助...我们可以为过去 6 个月左右创建这样的日历吗? 不客气。我们当然可以。确切的代码取决于您所说的“过去 6 个月”。以上是关于在 Join 中使用一个表,其中一个表具有过去三个月的所有日期 - Oracle的主要内容,如果未能解决你的问题,请参考以下文章
Pig Join - 如何连接具有多个字段的两个表,其中键中的一个字段是可选的?
SQL Multiple COUNT() 来自两个表,在一个 LEFT JOIN 中