проблема со сложным запросом, включающим возвращение 0 для отсутствия данных в результате запроса - PullRequest
0 голосов
/ 26 января 2012

У меня есть таблица, определенная в схеме Oracle11g, как эта

Txn_summ_dec
=================
id 
currentdate
resource_id
user_id
trans_id
eventdescptn

каждый ресурс имеет разные описания событий. Я даю диапазон дат (максимум 1 месяц или меньше) и resource_id и хочу получить различное количество всех пользователей для данного идентификатора ресурса, сгруппировать по currentdate, eventdescptn

Итак, у меня есть следующий запрос

SELECT COUNT(DISTINCT(txn_summ_dec.user_id)) as dusers, currentDate, eventdescptn
FROM Txn_summ_dec
WHERE resource_id = 1
AND currentdate BETWEEN TO_DATE('2011-12-01', 'YYYY-MM-DD') 
                    AND TO_DATE('2011-12-31', 'YYYY-MM-DD')
GROUP BY currentdate, eventdescptn

и это правильно дает мне результат ниже

dusers   currentdate            eventdescptn 
182      12/01/2011 00:00:00    Save 
33       12/04/2011 00:00:00    Save 
98       12/01/2011 00:00:00    Read
22       12/30/2011 00:00:00    Write

Я хочу получить результат в следующем формате:
Из запроса с указанным диапазоном дат предположим, что с 5-го по 5-е число месяца (или меньше) я хочу получить результаты для всех дат в диапазоне для всех eventdescptn ресурса. Если для определенной даты в диапазоне нет результата, для определенного события descptn тогда должна быть эта запись в наборе результатов со значением 'dusers' = 0
таким образом, если ресурс имеет 3 различных события события (Сохранить, Чтение, Запись) и диапазон дат составляет 5–30 числа месяца, то в наборе результатов должно быть в общей сложности 26X3 = 78 записей.
Как мне написать запрос для этого? Также мне нужно будет преобразовать его в спящий режим позже .. но SQL для начала хорошо Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 26 января 2012

Я не пробовал это, но мне интересно, не могли бы вы сделать:

 WITH the_query AS (
      ... your query here ...
 )
 SELECT dusers, currentdate, eventdescptn 
   FROM the_query
  WHERE 0 != ( SELECT COUNT(*) FROM the_query )
 UNION
 SELECT 0, NULL, NULL
   FROM the_query
  WHERE 0 = ( SELECT COUNT(*) FROM the_query )
0 голосов
/ 26 января 2012

Проверьте принятый ответ здесь: генерировать дни из диапазона дат

Если я правильно вас понимаю, у вас не обязательно будет событие для каждой даты в диапазоне в вашем журнале.Этот ответ дает вам возможность материализовать список дат в диапазоне.Если вы можете изменить его так, чтобы он включал 1 из каждой из этих дат для каждого события, вам просто нужно присоединиться к уже собранным здесь результатам и установить нулевые значения dUsers на ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...