Sql 当计数(*)与任何记录不匹配时,需要查询返回零
如果某个特定日期没有记录,我需要上面的查询返回计数0。 这似乎没有发生 我试过NVL,解码。 发现问题是由于group by子句引起的,但不确定如何解决此问题Sql 当计数(*)与任何记录不匹配时,需要查询返回零,sql,oracle,group-by,nvl,Sql,Oracle,Group By,Nvl,如果某个特定日期没有记录,我需要上面的查询返回计数0。 这似乎没有发生 我试过NVL,解码。 发现问题是由于group by子句引起的,但不确定如何解决此问题 请帮忙 很难理解你想要什么,但是 SELECT COUNT(*),TRUNC(TEST_DATE_CREATE) FROM TEST_TABLE WHERE TEST_DATE_CREATE > (SYSDATE - 10) GROUP BY TRUNC(TEST_DATE_CREATE); 当组中没有记录时,将返回null
请帮忙 很难理解你想要什么,但是
SELECT COUNT(*),TRUNC(TEST_DATE_CREATE)
FROM TEST_TABLE
WHERE TEST_DATE_CREATE > (SYSDATE - 10)
GROUP BY TRUNC(TEST_DATE_CREATE);
当组中没有记录时,将返回null
更新:现在更清楚您想要什么:
select decode(count(*), 0, null, count(*))
更新2:现在更清楚您想要的是什么,零而不是空:
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
您需要生成一个您感兴趣的日期列表,然后对表进行左外部联接,以查找匹配每个日期的记录。大概是这样的:
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;
公共表表达式本身生成日期列表:
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;
您可以调整级别限制及其添加到sysdate的方式,以修改范围,例如向后看或今天排除
然后,主select使用它来查找匹配的记录。因为它是一个外部联接,所以它列出了所有生成的日期,并且在没有匹配项的情况下计数为零
.你想完成什么?您的标题表明您希望count*返回NULL,而在问题描述中您提到如果没有行,您希望返回0。可能重复的可能重复的可能重复的,或者很抱歉混淆。上面的查询现在正在逐行返回。因为没有TEST_DATE_CREATE>SYSDATE-10的数据,所以我需要的是查询更新0,例如2013年6月1日0 2013年6月2日0 2013年6月3日
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