2013-10-09 33 views
0

我試圖根據來源分組然後日期,然後狀態並獲得每個的計數。這是工作在我的代碼:如何在選擇組中的SQL中使用匯總由

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 
Source1 10/3/2013 C 19 
Source1 10/3/2013 O 6 
Source1 10/4/2013 C 5 
Source1 10/4/2013 O 8 
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 
Source4 10/2/2013 C 18 
Source4 10/2/2013 O 8 
Source4 10/3/2013 C 23 
Source4 10/3/2013 O 13 

不過,我想獲得每個源,每個日期,每個狀態的總和或總數。我在GROUP BY結尾嘗試了WITH ROLLUP,但收到了Oracle錯誤。

我想輸出將得到上述結果和一些額外的數是這樣的:

Source Date Status Count 
Source1   84  --Shows counts for each source 
Source2   29 
Source3   2 
Source4   128 
Source1  O 18  --Show counts each source by status 
Source2  C 7 
Source3  O 2 
Source3  C 0 
Source4  O 48 
Source4  C 80 
all src 9/30/2013 O 15  --Show counts each source by date & status 
all src 9/30/2013 C 25 
all src 10/1/2013 O 12 
all src 10/1/2013 C 20 
all src 10/2/2013 O 15 
all src 10/2/2013 C 10 
all src 10/3/2013 O 0 
all src 10/3/2013 C 25 
all src 10/4/2013 O 15 
all src 10/4/2013 C 13 

也許這並不甚至可以通過ROLLUP

林不知道這是否是合適的解決方案,我發現它返回我有麻煩的閱讀效果:

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 
ROLLUP (sourceCode, to_char(myTimestamp, 'YYYY-MM-DD'), statusCode) 
ORDER BY 1, 2, 3 

而這些輸出結果:

Source Date Status Count 
Source1 10/1/2013  8 
Source1 10/2/2013 C 24 
Source1 10/2/2013 O 4 
Source1 10/2/2013  28 
Source1 10/3/2013 C 19 
Source1 10/3/2013 O 6 
Source1 10/3/2013  25 
Source1 10/4/2013 C 5 
Source1 10/4/2013 O 8 
Source1 10/4/2013  13 
Source1   84 
Source2 10/4/2013 C 22 
Source2 10/4/2013 O 7 
Source2 10/4/2013  29 
Source2   29 
Source3 10/1/2013 C 2 
Source3 10/1/2013  2 
Source3   2 
Source4 9/30/2013 C 15 
Source4 9/30/2013 O 15 
Source4 9/30/2013  30 
Source4 10/1/2013 C 24 
Source4 10/1/2013 O 12 
Source4 10/1/2013  36 
Source4 10/2/2013 C 18 
Source4 10/2/2013 O 8 
Source4 10/2/2013  26 
Source4 10/3/2013 C 24 
Source4 10/3/2013 O 12 
Source4 10/3/2013  36 
Source4 10/4/2013 C 30 
Source4 10/4/2013 O 11 
Source4 10/4/2013  41 
Source4   169 
      284 
+0

你試過了嗎?GROUP BY cube(sourceCode,to_char(myTimestamp,'YYYY-MM-DD'),statusCode)'? –

+0

@EgorSkriptunoff是的,我做了彙總我粘貼我的結果,但我不明白如何解釋它們,看看它是否需要,因爲它只是給了一堆數字在結尾處的「空白」列 – Kairan

+0

使用'GROUPING(column_name )'功能。 –

回答

1

試試這個:http://sqlfiddle.com/#!4/98d9e/6/0
我用了一筆總和而不是一個計數,因爲我模擬了你的第一個輸出。我不想輸入原始數據。

Egor的評論是正確的,使用立方體函數來獲取源,日期和狀態之間的所有各種組合。多維數據集的行數將爲2^n,其中n =多維數據集語句中的列數。空列表示小計的行。小提琴中的解碼語句負責處理這些內容,併爲小計輸入'​​all ...'。如果您需要使用外部查詢來查找特定的小計,這也會很有幫助。

Oracle文檔有一些相當不錯的立方體示例。 http://docs.oracle.com/cd/E11882_01/server.112/e25554/aggreg.htm#DWHSG8614

+0

嗨 - 你能解釋1解碼嗎?我看了Decode在線的例子,它說它應該是一個你正在搜索的值:DECODE(expression,search,result [,search,result] ... [,default]) http://www.techonthenet。 com/oracle/functions/decode.php – Kairan

+0

解碼有點像花式nvl檢查。當你說你給它一個表達式,一個搜索,如果它發現了搜索,該怎麼做,以及沒有找到它的結果,你是對的。分組子句對於聚合行返回1,對於詳細信息行返回0。解碼是說,如果聚合行然後使用'all ...'的結果而不是空的,否則使用那裏的東西(Source1或Source2或C或O等)。 –

+0

+1和accept =)這太好了 - 謝謝它運作良好,我只需要修改一個子查詢,以便我可以得到它返回更多的細節(例如,9/30/13沒有Source1狀態=' O',所以它不顯示0,這是無關的,但只需要我自己的工作,因爲我想 – Kairan