2012-05-13 13 views
1

私は、日付に基づいて受信したメッセージの数を表示するクエリを持っています。例:の場合 :データがなくてもテーブルのデータを表示する! Oracle

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 

あなたには、いくつかの日に受け取ったメッセージがない見ることができるように。私が欲しいのは、それはすべての日付を表示する必要がありますし、何もメッセージを受信して​​いないがある場合は、テーブルに行がないときに私はこれを達成することができますどのようにこの

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 

のように0を示すべきでしょうか?

答えて

0

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

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 

日付範囲は、この、何あなたの範囲はやりたい方法を正確に依存します。

+0

こんにちは。私はあなたの解決策を試してみました.1-31の日付を保存していて、外部はmytableの日付の列に参加しましたが、一致する日付の列しか表示されません。 – Mohsin

+0

大丈夫私は他の方法round.andそれは私に結果とnull.Nowとして他の結果を与えた私はそれらのすべてのnullデータがそのテーブルから正確なデータであることを望んでいる(データは固定されて固定されています)とメッセージ数の列0 – Mohsin

+0

あなたの質問を正しく理解し、最初の列をNULLではなく0にしたい場合は、その列が何であってもNVL(column_name、0)を使用します。 – eaolson

0

左外部結合でこれを達成することができます。IFこれに参加する可能性のあるすべての日付が含まれる別のテーブルがありました。

一時テーブルに日付を生成し、それをクエリに追加することもできます。

このようなことが、このトリックを行う可能性があります。

日付を保持するためのTempTableが作成されます
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 

...私はちょうど今日から始まるそれらの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 

メッセージの件数をそのまま残すことができます。

+0

他のテーブルにはdatesは含まれていません。唯一のテーブルですが、日付付きの一時テーブルを生成して結合またはマージすると、私には望ましい結果が得られるかもしれません。 私はDBA言語にはあまりよくないので、日付付きの一時データテーブル(C#)を生成し、元のテーブルとマージします。この作業は? – Mohsin

+0

うまくいくでしょう。上記のサンプルコードを追加して、どのように表示したかを示します。 –

+0

大丈夫私はあなたの質問を見つけさせて、私はあなたに戻って戻ってきます。私を導いてくれてありがとう。 – Mohsin

1

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

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

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つの取引があることを前提としています。そうでない場合は、より大きなテーブルを使用できます。

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

関連する問題