Sql 涉及返回0的复杂查询问题,因为查询结果中没有数据

Sql 涉及返回0的复杂查询问题,因为查询结果中没有数据,sql,oracle11g,Sql,Oracle11g,我在Oracle11g模式中定义了这样一个表 Txn_summ_dec ================= id currentdate resource_id user_id trans_id eventdescptn 每个资源都有不同的事件描述。 我给出了一个日期范围(最长为1个月或更短)和资源id,并希望获得给定资源id、group by currentdate、eventdescptn的所有用户的不同计数 因此,我有以下疑问 SELECT COUNT(DISTINCT(txn_sum

我在Oracle11g模式中定义了这样一个表

Txn_summ_dec
=================
id 
currentdate
resource_id
user_id
trans_id
eventdescptn
每个资源都有不同的事件描述。 我给出了一个日期范围(最长为1个月或更短)和资源id,并希望获得给定资源id、group by 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个不同的EventDescptn(保存、读取、写入),并且日期范围是一个月的第5个到第30个,那么resultset中应该总共有26X3=78条记录。。
我如何为此编写查询? 另外,我以后还需要将其转换为hibernate。。但是,从Sql开始就可以了
提前感谢

在此处检查已接受的答案:


如果我理解正确,您不必在日志范围内的每个日期都有事件。这个答案为您提供了一种具体化范围内日期列表的方法。如果您可以修改它,使其包含每个事件的每个日期中的1个,那么您只需返回到已经在此处聚合的结果,并将null dUsers设置为零

我还没有试过,但我想知道您是否可以:

 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 )

给存储的
时间戳
列“currentdate”贴标签是错误的-应该给它贴上类似于发生的
事件的标签(它肯定不再是“当前的”)。您需要创建一个
事件
表,该表包含描述,并且只存储ID。您希望按时间戳的日期分组,而不是(至少)秒精度。当然,更改列的名称对我来说没问题,它只存储日期而不存储时间信息。您是否建议使用临时表事件来获得结果?如果是,怎么做?不,不是一个临时表,创建一个永久的
事件
表,只在这个汇总表中存储ID。另外,您是否确定您的
currentdate
字段是type date?您正在将时间包括在结果中?您可能希望该时间用于记录目的。此外,范围比较的建议是最小包容,最大排斥;所以
和currentDate>=截止日期('2011-12-01','YYYY-MM-DD')和currentDate<截止日期('2011-12-01','yyyyy-MM-DD')+间隔1个月
(此处猜测oracle语法)。假设OP需要所有日期的数据(范围内),则不需要(因为您给出的是
null
日期)。我非常确信,除非原始查询返回0个结果,否则语句的后半部分不会返回任何结果。此外,如果它确实生成了“缺失”日期,那么您没有给它任何终止条件——“无限”结果。