Oracle显示0表示没有数据的日期

时间:2016-05-31 18:02:11

标签: 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-2016  7
04-JAN-2016  0
05-JAN-2016  3

如何在Oracle中实现这一目标?

2 个答案:

答案 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

您的示例可能属于微不足道的类别,但在其他情况下也要注意此方法。