我需要查询显示某段时间的所有日子(例如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
来显示所有日期。
答案 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;
将提供您想要的结果