显示范围内的所有日期并显示当天的行数

时间:2017-02-21 14:35:00

标签: sql oracle

我需要查询显示某段时间的所有日子(例如2017年1月1日至12月1日),然后每天我需要显示当天插入的行数由插入它的客户分组。

例如,我有这张表:

+------------+------------+-----------+
| customerId |    Date    |  Message  |
+------------+------------+-----------+
|          1 | 01/01/2017 | Message 1 |
|          1 | 01/01/2017 | Message 2 |
|          1 | 01/01/2017 | Message 3 |
|          2 | 01/01/2017 | Message 1 |
|          2 | 01/01/2017 | Message 2 |
|          1 | 02/01/2017 | Message 3 |
|          1 | 02/01/2017 | Message 4 |
|          2 | 03/01/2017 | Message 3 |
+------------+------------+-----------+

结果应该是这样的:

+------------+------------+----------+
|    Date    | customerId | messages |
+------------+------------+----------+
| 01/01/2017 |          1 |        3 |
| 01/01/2017 |          2 |        2 |
| 02/01/2017 |          1 |        2 |
| 02/01/2017 |          2 |        0 |
| 03/01/2017 |          1 |        0 |
| 03/01/2017 |          2 |        1 |
+------------+------------+----------+

我已经有了这个问题:

SELECT TRUNC (SYSDATE + ROWNUM, 'DD') as dt
FROM DUAL CONNECT BY ROWNUM < 12

这给了我一张表格,其中包含x天数的日期范围(在本例中为12)。我已经尝试使用这个DUAL表(LEFT JOIN和JOIN)加入我的表,但它并没有给我我需要的结果。

编辑:我发现我可以使用CROSS JOIN来显示所有日期。

2 个答案:

答案 0 :(得分:2)

我终于明白了:

SELECT *
FROM (SELECT DAT.*, V.ID, V.NAME
     FROM (SELECT TRUNC ((SYSDATE - 22) + ROWNUM, 'DD') as dt
     FROM DUAL CONNECT BY ROWNUM <= 4) DAT CROSS JOIN (SELECT ID, NAME FROM ORGANISATIONS) V) DATES 
LEFT JOIN 
(SELECT OGE_ID, TRUNC(REGISTRATIONDATE) AS roundday, COUNT(*) FROM ZAKEN GROUP BY TRUNC(REGISTRATIONDATE), OGE_ID) CASES 
ON DATES.DT = CASES.roundday AND DATES.ID = CASES.OGE_ID;

答案 1 :(得分:0)

从您的表格示例:

select Date, customerId, count(messages) from tablename group by Date, customerId;

将提供您想要的结果