Oracle为没有数据的日期显示0
我正在收集过去一年的每日数据。有些日期有0个订单,我想显示这一点,而不是完全忽略 我有这样一个简单的查询:Oracle为没有数据的日期显示0,oracle,missing-data,Oracle,Missing Data,我正在收集过去一年的每日数据。有些日期有0个订单,我想显示这一点,而不是完全忽略 我有这样一个简单的查询: SELECT DATE, COUNT(*) FROM ORDERS GROUP BY DATE ORDER BY DATE 而不是返回 Date Count 01-JAN-2016 5 03-JAN-2016 7 05-JAN-2016 3 我想得到: Date Count 01-JAN-2016 5 02-JAN-2016 0 03-JAN-
SELECT DATE, COUNT(*) FROM ORDERS
GROUP BY DATE
ORDER BY DATE
而不是返回
Date Count
01-JAN-2016 5
03-JAN-2016 7
05-JAN-2016 3
我想得到:
Date Count
01-JAN-2016 5
02-JAN-2016 0
03-JAN-2016 7
04-JAN-2016 0
05-JAN-2016 3
如何在Oracle中实现这一点?您需要一些其他表格,其中包含您感兴趣的所有日期;您可以使用以下内容动态构建这样的东西 设置: 您的查询:
<>这将考虑在01 / 01 / 2016和10/01/2016之间的日期,使用表中的外部连接;您可以对其进行编辑,以更好地适应您感兴趣的时间间隔。您需要一些其他表格,其中包含您感兴趣的所有日期;您可以使用以下内容动态构建这样的东西 设置: 您的查询:
<>这将考虑在01 / 01 / 2016和10/01/2016之间的日期,使用表中的外部连接;您可以对其进行编辑,以更好地适应您感兴趣的时间间隔。在Oracle中,对于具有分区外部联接(专门为填充稀疏数据而设计)的非平凡情况,这是最有效的 此处记录:
您的示例可能属于普通类,但在其他情况下也要注意此方法。在Oracle中,对于具有分区外部联接(专门为填充稀疏数据而设计)的非普通情况,这是最有效的方法 此处记录:
您的示例可能属于普通类别,但在其他情况下也要注意此方法。这是正确的,除非您需要+level-1以包含1月1日级别,而不是0。这是正确的,除非您需要+level-1以包含1月1日级别,而不是0。
SQL> CREATE TABLE test_date (date_col) AS
2 (SELECT TO_DATE('01012016', 'ddmmyyyy') FROM DUAL UNION ALL
3 SELECT TO_DATE('02012016', 'ddmmyyyy') FROM DUAL UNION ALL
4 SELECT TO_DATE('02012016', 'ddmmyyyy') FROM DUAL UNION ALL
5 SELECT TO_DATE('04012016', 'ddmmyyyy') FROM DUAL UNION ALL
6 SELECT TO_DATE('04012016', 'ddmmyyyy') FROM DUAL UNION ALL
7 SELECT TO_DATE('06012016', 'ddmmyyyy') FROM DUAL UNION ALL
8 SELECT TO_DATE('06012016', 'ddmmyyyy') FROM DUAL
9 );
Table created.
SQL> SELECT date_col2, COUNT(date_col)
2 FROM ( SELECT TO_DATE('01012016', 'ddmmyyyy') + LEVEL -1 AS date_col2
3 FROM DUAL
4 CONNECT BY TO_DATE('01012016', 'ddmmyyyy') + LEVEL -1 <= TO_DATE('10012016', 'ddmmyyyy')) dates
5 LEFT OUTER JOIN test_date ON (date_col = date_col2)
6 GROUP BY date_col2
7 ORDER BY 1;
DATE_COL2 COUNT(DATE_COL)
--------- ---------------
01-GEN-16 1
02-GEN-16 2
03-GEN-16 0
04-GEN-16 2
05-GEN-16 0
06-GEN-16 2
07-GEN-16 0
08-GEN-16 0
09-GEN-16 0
10-GEN-16 0
10 rows selected.