1

日付に基づいて受信したメッセージの数を表示するクエリがあります。例:

1 | 1-May-2012 
3 | 3-May-2012 
4 | 6-May-2012 
7 | 7-May-2012 
9 | 9-May-2012 
5 | 10-May-2012 
1 | 12-May-2012

ご覧のとおり、一部の日付にはメッセージが受信されていません。私が望むのは、すべての日付を表示し、受信したメッセージがない場合はこのように 0 を表示することです

1 | 1-May-2012
0 | 2-May-2012
3 | 3-May-2012
0 | 4-May-2012
0 | 5-May-2012
4 | 6-May-2012
7 | 7-May-2012
0 | 8-May-2012
9 | 9-May-2012
5 | 10-May-2012
0 | 11-May-2012
1 | 12-May-2012

テーブルに行がない場合、どうすればこれを達成できますか?

4

3 に答える 3

1

まず、あなたのアプリケーションはカレンダー テーブルから恩恵を受けるように思えます。カレンダー テーブルは、日付と日付に関する情報のリストです。

次に、一時テーブルを使用せずにこれを行うことができます。アプローチは次のとおりです。

with constants as (select min(thedate>) as firstdate from <table>)
     dates as (select( <firstdate> + rownum - 1) as thedate
               from (select rownum
                     from <table> cross join constants
                     where rownum < sysdate - <firstdate> + 1
                    ) seq
              )
select dates.thedate, count(t.date)
from dates left outer join
     <table> t
     on t.date = dates.thedate
group by dates.thedate

これがアイデアです。エイリアス定数は、テーブルの最も早い日付を記録します。エイリアスの日付は、一連の日付を作成します。内側のサブクエリは、rownum を使用して一連の整数を計算し、これらを最初の日付に追加します。これは、平均して 1 日あたり少なくとも 1 回の取引があることを前提としています。そうでない場合は、より大きなテーブルを使用できます。

最後の部分は、日付に関する情報を戻すために使用される結合です。count(*) の代わりに count(t.date) を使用していることに注意してください。これにより、テーブル内のレコード数がカウントされます。データのない日付の場合は 0 になります。

于 2012-05-13T13:28:11.447 に答える
0

このために別のテーブルは必要ありません。クエリで必要なものを作成できます。これは5月に機能します:

WITH month_may AS (
    select to_date('2012-05-01', 'yyyy-mm-dd') + level - 1 AS the_date
    from dual
    connect by level < 31
)
SELECT *
  FROM month_may mm
  LEFT JOIN mytable t ON t.some_date = mm.the_date

日付範囲は、これをどの程度正確に行いたいか、および範囲が何であるかによって異なります。

于 2012-05-13T20:09:42.073 に答える
0

可能なすべての日付を含む結合する別のテーブルがある場合は、左外部結合でこれを実現できます。

1 つのオプションは、一時テーブルで日付を生成し、それをクエリに結合することです。

このようなものがうまくいくかもしれません。

CREATE TABLE #TempA (Col1 DateTime)
DECLARE @start DATETIME = convert(datetime, convert(nvarchar(10), getdate(), 121))
SELECT @start

DECLARE @counter INT = 0

WHILE @counter < 50
BEGIN
    INSERT INTO #TempA (Col1) VALUES (@start)
    SET @start = DATEADD(DAY, 1, @start)
    SET @counter = @counter+1
END

これにより、日付を保持するための TempTable が作成されます...今日から 50 個の日付を生成しました。

SELECT 
    a.Col1,
    COUNT(b.MessageID)
FROM
    TempA a
    LEFT OUTER JOIN YOUR_MESSAGE_TABLE b
        ON a.Col1 = b.DateColumn
GROUP BY
    a.Col1

次に、メッセージ数をそれに参加させることができます。

于 2012-05-13T10:40:09.307 に答える