复杂查询的问题涉及返回0表示查询结果中没有数据

时间:2012-01-25 23:34:23

标签: sql oracle11g

我在Oracle11g架构中定义了一个像这样的

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

每个资源都有不同的事件描述。 我给出了一个日期范围(最长1个月或更短)和resource_id,我希望获得给定资源ID的所有用户的不同计数,按当前日期分组,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个不同的eventdescptns(保存,读取,写入),并且日期范围是一个月的5到30,那么结果集中应该总共有26X3 = 78条记录。
我该如何编写查询? 另外我需要稍后将其转换为休眠..但是Sql开始就可以了 提前致谢

2 个答案:

答案 0 :(得分:0)

检查接受的答案: generate days from date range

如果我理解正确,您不一定会在日志范围内的每个日期都有一个事件。该答案为您提供了一种实现范围内日期列表的方法。如果您可以修改它以在每个事件中包含每个日期中的一个,那么您只需要加入回已经聚合的结果并将null dUsers设置为零。

答案 1 :(得分:0)

我没试过这个,但我想知道你能否做到:

 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 )