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子句引起的,但不确定如何解决这个问题。
请帮助!!
答案 0 :(得分: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
以修改范围,例如进一步回顾或排除今天。
然后,主要选择使用它来查找匹配的记录。因为它是外连接,所以它列出了所有生成的日期,并且在没有匹配的情况下计数为零。
答案 1 :(得分:0)
很难理解你想要的东西,但是
select decode(count(*), 0, null, count(*))
当组中没有记录时,将返回null。
更新:现在更清楚您想要的内容:
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;