我正在提取过去一年的每日数据。有些日期有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-2016 7
04-JAN-2016 0
05-JAN-2016 3
如何在Oracle中实现这一目标?
答案 0 :(得分:3)
您需要一些其他表格,其中包含您感兴趣的所有日期;你可以通过以下方式动态构建这样的东西。
<强>设定:强>
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.
这将考虑2016年1月1日至2016年1月10日之间的日期,使用您在外部联接中的表格;你可以编辑它以更好地适应你感兴趣的间隔。
答案 1 :(得分:1)
在Oracle中,对于使用分区外连接的非平凡案例,这是最有效的,专门用于填充稀疏数据。
此处记录:https://docs.oracle.com/cd/E11882_01/server.112/e25555/tdpdw_sql.htm#TDPDW00736
您的示例可能属于微不足道的类别,但在其他情况下也要注意此方法。