2017-02-21 15 views
1

Мне нужен запрос, который показывает все дни определенного периода (например, с 01/01/2017 по 12/01/2017), а затем для каждого день Мне нужно показать количество строк, вставленных в этот день, сгруппированных клиентом, который его вставил.Показать все даты в диапазоне и показать количество строк в этот день

Так, например, у меня есть эта таблица:

+------------+------------+-----------+ 
| 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

я удалил MySQL тег, как синтаксис выглядит как Oracle. –

+0

О да, простите, это было предложено. –

+0

Я только что узнал, что мне, вероятно, нужен «CROSS JOIN» –

ответ

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; 
0

Из вашего примера таблицы:

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

даст желаемый результат

+0

Это не дает мне даты, у которых нет результатов , –