2013-08-22 1 views
1

Я хочу подсчитывать строки в таблице и группировать их по дате. Данные будут использоваться для графов первенствовать позже, поэтому было бы проще, если результат также включены даты с графом, равным 0.Получение каждого результата подсчета строк при группировке по дате в Oracle

Например, выполнение

SELECT date, count(*) 
FROM Table 
GROUP BY date 
ORDER BY 1 

дает мне

... 
2013-01-01 5 
2013-01-03 35 
2013-01-04 57 
2013-01-05 51 
2013-01-07 50 
2013-01-09 15 
... 

то, что я хочу, чтобы результат будет в

... 
2013-01-01 5 
2013-01-02 0 
2013-01-03 35 
2013-01-04 57 
2013-01-05 51 
2013-01-06 0 
2013-01-07 50 
2013-01-08 0 
2013-01-09 15 
... 

есть ли способ, чтобы получить SUC h без создания таблицы со всеми датами и присоединения к ней с оригиналом, и если да, то что это?

ответ

2

вы можете создать все даты, которые вам нужны, без создания таблицы.

Если вам нужны все даты от 1.1.2013 до сегодняшнего дня вы можете использовать следующий запрос:

select (SYSDATE - level) d1 from dual connect by level < (TRUNC(SYSDATE, 'DD') - DATE '2013-01-01') 

, а затем присоединиться к нему с вами таблицы с помощью внешнего соединения

SELECT all_days.d1, SUM(CASE when table.date is null then 0 else 1 end) 
FROM 
    (select (SYSDATE - level) d1 
    from dual 
    connect by level < (TRUNC(SYSDATE, 'DD') - DATE '2013-01-01') 
) all_days 
    left outer join table on table.DATE = all_days.d1 

GROUP BY all_days.d1 
ORDER BY 1 
+0

@mafodope: I» я отредактировал свой ответ. count (*) включает все записи. мы должны считать только записи из таблицы (table.date не равно null). вот почему использовать SUM вместо count – schurik

+0

Я исправил это на своем конце, спасибо. Возможно ли заменить DATE '2013-01-01', например. SELECT MIN (table.date) FROM table или что-то в этом роде? – mafodope

+0

Да, это так. Получил это сам, спасибо. – mafodope

Смежные вопросы