2012-05-13 100 views
1

我有一個查詢,顯示根據日期收到的消息計數。 對於EG:即使沒有數據,也可以顯示錶中的數據!甲骨文

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

嗨eaolson。我試過你的解決方案,我在1-31存儲日期,並且留下了外部連接mytable日期列,但它只會顯示匹配的日期列。請你幫助我嗎? – Mohsin

+0

好吧我得到它的工作方式round.and它給了我匹配的結果和其他結果爲null.Now我的問題是我希望所有這些空數據是來自該表的確切數據(數據是固定的固定的)和消息計數列爲0 – Mohsin

+0

如果我正確理解您的問題,並且希望第一列爲0而不是NULL,則可以使用NVL(column_name,0)對列進行任何操作。 – eaolson

0

您可以通過左外部連接實現此目的如果您有其他表加入到包含所有可能日期的表中,請參閱

一個選項可能是在臨時表中生成日期並將其加入到查詢中。

像這樣的事情可能會伎倆。

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 

然後你可以留下來加入你的消息。

+0

沒有其他表包含日期。它是唯一的表,但我認爲生成包含日期和連接或合併的臨時表可能會給我想要的結果。 我對DBA語言不太熟悉,所以我將生成帶有日期的臨時數據表(c#)並將它與原始數據表合併在一起。這項工作是否會完成? – Mohsin

+0

是的,這將工作。我已經在上面添加了一些示例代碼來演示如何。 –

+0

好吧,讓我知道你的問題,我會回覆給你。非常感謝你的指導。 – Mohsin

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計算整數序列,然後將這些添加到第一個日期。請注意,假設您每個日期平均至少有一筆交易。如果沒有,您可以使用更大的表格。

最後一部分是用於恢復日期信息的連接。請注意使用count(t.date)而不是count(*)。這將統計表中的記錄數,對於沒有數據的日期應該爲0。