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

メインの select はそれを使用して、一致するレコードを探します。これは外部結合であるため、生成されたすべての日付がリストされ、一致するものがない場合はカウントが 0 になります。

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 : 必要なものがより明確になりました。null ではなくゼロです。

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 に答える