2013-10-11 85 views
1

我想找回一些報告數據SELECT查詢到的所有記錄

這個返回值是我的查詢:

SELECT sourceCode as "Source", to_char(myTimestamp, 'YYYY-MM-DD') as "Date", statusCode as "Status", count(*) as "Count" 
FROM archive_table 
WHERE myTimestamp BETWEEN TO_TIMESTAMP('2013-09-30','yyyy-mm-dd') AND TO_TIMESTAMP('2013-10-05','yyyy-mm-dd') 
GROUP BY sourceCode, to_char(myTimestamp, 'YYYY-MM-DD'), statusCode 
ORDER BY 1, 2, 3 

這是輸出:

Source Date Status Count 
Source1 9/30/2013 C 10 
Source1 10/1/2013 C 8 
Source1 10/2/2013 C 24 
Source1 10/2/2013 O 4 
Source2 10/4/2013 C 22 
Source2 10/4/2013 O 7 
Source3 10/1/2013 C 2 
Source4 9/30/2013 C 15 
Source4 9/30/2013 O 15 
Source4 10/1/2013 C 24 
Source4 10/1/2013 O 12 

我會喜歡看所有的計數爲0,例如Source1與日期9/30/2013在數據庫中沒有狀態0,所以我想要它顯示:

Source1 9/30/2013 O 0 

另一個例子,現在有源2在所有的2013年9月30日,所以應該顯示:

Source2 9/30/2013 O 0 
Source2 9/30/2013 C 0 

林希望有一個簡單的方法來做到這一點。有關其他信息,只有4個「來源」,狀態是「O」或「C」,顯然日期範圍在where子句中提供。

回答

2

SQL Fiddle for easy reference

做到這一點,最簡單的方法是,如果你有一個包含可能的來源值,狀態和日期表。即使你不這樣做,你仍然可以生成支持查詢的派生表。

這會生成您嘗試查詢的來源,狀態和日期的每個組合。

select 
    * 
from 
    (select 'Source1' Source from Dual 
    union select 'Source2' from Dual 
    union select 'Source3' from Dual 
    union select 'Source4' from Dual 
    ) s 
    cross join (
    select 'O' Status from Dual 
    union select 'C' from Dual 
    ) c 
    cross join (
    select '2013-09-30' Dt from Dual 
    union select '2013-10-01' from Dual 
    union select '2013-10-02' from Dual 
    union select '2013-10-03' from Dual 
    union select '2013-10-04' from Dual 
    union select '2013-10-05' from Dual 
    ) d; 

然後你就可以走了這一切,離開加入到你的archive_table,做您的分組上所製作的數據,而不是你的基地臺,並做你的archive_table一列的數量。

select 
    s.Source, 
    c.Status, 
    d.Dt, 
    count(t.Source) 
from 
    (select 'Source1' Source from Dual 
    union select 'Source2' from Dual 
    union select 'Source3' from Dual 
    union select 'Source4' from Dual 
    ) s 
    cross join (
    select 'O' Status from Dual 
    union select 'C' from Dual 
    ) c 
    cross join (
    select '2013-09-30' Dt from Dual 
    union select '2013-10-01' from Dual 
    union select '2013-10-02' from Dual 
    union select '2013-10-03' from Dual 
    union select '2013-10-04' from Dual 
    union select '2013-10-05' from Dual 
    ) d 
    left join test t 
    on s.Source = t.Source 
     and c.Status = t.Status 
     and d.Dt = t.Dt 
group by 
    s.Source, 
    c.Status, 
    d.Dt 
+0

有可能做到這一點更簡單的方法,但我並不十分熟悉Oracle的細微差別,因爲我主要使用SQL Server。至少,這是有效的,也許有人會帶來更優雅的答案。 –

+0

Derek有沒有辦法將您的交叉連接留在另一個查詢中?類似於(左連接交叉連接的結果)x左連接(我自己的查詢的結果)y on x.source = y.source ...等我昨晚在玩它,我一直在犯錯誤 - 我想我只知道如何加入到現有的表 – Kairan

+0

我的查詢確實如此。看到最後一個連接,它做一個左連接「測試」 –

1

,而不是一個日期範圍內指定每個日期,請使用以下,您只需要包括開始和結束日期:

SELECT 
    TO_DATE('09/30/2013','mm/dd/yyyy') - 1 + LEVEL dt 
FROM dual 
    CONNECT BY 
LEVEL <= (TO_DATE('10/05/2013','mm/dd/yyyy') 
     - TO_DATE('09/30/2013','mm/dd/yyyy')) + 1 
相關問題