2013-06-10 1 views
0
SELECT COUNT(*),TRUNC(TEST_DATE_CREATE) 
FROM TEST_TABLE 
WHERE TEST_DATE_CREATE > (SYSDATE - 10) 
GROUP BY TRUNC(TEST_DATE_CREATE); 

Мне нужен приведенный выше запрос, чтобы вернуть счет 0 в случае отсутствия записей для определенной даты. Это, похоже, не происходит.Нужно запросить возврат нуля, когда счетчик (*) не соответствует никаким записям.

Я попробовал NVL, расшифровал. Установлено, что проблема связана с положением group by, но не уверен, как это исправить.

Пожалуйста, помогите!

+2

Что вы пытаетесь достичь? Ваш заголовок подсказывает, что вы хотите, чтобы count (*) возвращал NULL, а в описании проблемы упоминается, что вы хотите вернуть 0 в случае отсутствия строк. – diederikh

+0

Возможный дубликат [Группировка записей по часам или день за днем ​​и заполнение пробелов нулем или нулем] (http://stackoverflow.com/questions/10798905/grouping-records-hour-by-hour-or-day-by -для и заполнения-пробелов-с-нулем или-null) –

+0

Возможный дубликат [SQL trunc/group/order by date (день/месяц/квартал/год) с датой пропусков суммы без данных] (http: //stackoverflow.com/questions/14231374/sql-trunc-group-order-by-dates-day-month-quarter-year-with-sum-skip-dates-with) – Ben

ответ

1

Вам нужно создать список из интересующих вас дат, а затем выполните левое внешнее соединение с вашей таблицей, чтобы найти записи, соответствующие каждой дате. Что-то вроде этого:

with tmp_dates as (
    select trunc(sysdate) - level + 1 as tmp_date 
    from dual 
    connect by level <= 10 
) 
select count(tt.test_date_create), td.tmp_date 
from tmp_dates td 
left join test_table tt on trunc(tt.test_date_create) = td.tmp_date 
group by td.tmp_date 
order by tmp_date; 

Распространенное выражение таблица сама по себе генерирует список дат:

select trunc(sysdate) - level + 1 as tmp_date 
from dual 
connect by level <= 10; 

TMP_DATE 
--------- 
10-JUN-13 
09-JUN-13 
08-JUN-13 
07-JUN-13 
06-JUN-13 
05-JUN-13 
04-JUN-13 
03-JUN-13 
02-JUN-13 
01-JUN-13 

Вы можете настроить level предел и как он добавляется к sysdate изменить диапазон, например, смотреть дальше назад или исключать сегодня.

Главный выбор затем использует это для поиска соответствующих записей. Поскольку это внешнее объединение, он перечисляет все сгенерированные даты и количество нулей, где нет совпадений.

SQL Fiddle.

0

Трудно понять, что вы хотите, но

select decode(count(*), 0, null, count(*)) 

возвратит нуль, если нет записей в группе.

UPDATE: Теперь яснее, что вы хотите:

select date_code, cnt 
from(
    select trunc(sysdate-10) + level - 1 as date_code 
    from dual 
    connect by level <= 10 
    ) 
left join(
    SELECT COUNT(*) cnt,TRUNC(TEST_DATE_CREATE) trunc_create 
    FROM TEST_TABLE 
    WHERE TEST_DATE_CREATE > (SYSDATE - 10) 
    GROUP BY TRUNC(TEST_DATE_CREATE); 
) on trunc_create = date_code 

UPDATE2: Теперь ясно, что вы хотите, нули не обнуляет:

select date_code, count(*) 
from(
    select trunc(sysdate-10) + level - 1 as date_code 
    from dual 
    connect by level <= 10 
    ) 
left join TEST_TABLE on TRUNC(TEST_DATE_CREATE) = date_code 
GROUP BY date_code; 
+0

извините за путаницу. Следующий запрос теперь проверяет теперь rows.since, поскольку нет данных для TEST_DATE_CREATE> (SYSDATE - 10) – Chittprakash

+0

Мне нужен запрос для повторного набора 0 например 0 1-июня 2013 г. 0 2-ju ne-2013 0 3-июня 2013 г. – Chittprakash