0
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 子句,但不知道如何解决这个问题。

请帮忙 !!

4

2 回答 2

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以修改范围,例如进一步回顾或排除今天。

然后主选择使用它来查找匹配的记录。因为它是一个外连接,所以它列出了所有生成的日期,以及没有匹配项的计数为零。

SQL 小提琴

于 2013-06-10T08:21:51.750 回答
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;
于 2013-06-10T07:53:20.773 回答