2014-03-01 275 views
0

我想知道累計累計總數是否可能。我想與之合作的一個例子是今年影響美國的風暴。我想要一個列出2014年月份的結果集,以及直到那個月爲止影響美國的累計風暴總數。我希望得到的東西3列 - 看起來像這個月,NumberofStorms和CumulativeSum:累計累計總數

Month  NumberofStorms  CumulativeSum 
----------------------------------------------- 
Jan    2     2 
Feb    1     3 
Mar    1     4 
Apr    0     4 
May    0     4 
Jun    0     4 
Jul    0     4 
Aug    0     4  
Sep    1     5 
Oct    3     8 
Nov    5     13 
Dec    8     21 

我怎樣才能做到這一點?

+0

您使用的數據庫是?你試過什麼了?另外,你的源數據是什麼樣的? –

+1

這不是一個真實的場景,但我試圖創建場景並回答它們,以便我可以在SQL中學習分析函數。我想在Oracle數據庫上使用我的查詢。 – Canzee

回答

1

您可以添加一個窗口,一個SUM()

SELECT "Month" 
     ,"NumberofStorms" 
     ,SUM("NumberofStorms") OVER(ORDER BY "Month" ROWS BETWEEN unbounded preceding and current row) AS CumulativeSum 
FROM Table1 

演示:SQL Fiddle

注:本月在演示按字母順序排序,並沒有刻意去輸入實際日期,因爲它只是一個示例場景。

更新:讓我們假設基表只是MonthStormName,你需要一個CTE /子查詢首先獲得運行總計計數,然後可以在上面使用:

SELECT "Month" 
     ,"NumberofStorms" 
     ,SUM("NumberofStorms") OVER(ORDER BY "Month" ROWS BETWEEN unbounded preceding and current row) AS CumulativeSum 
FROM (SELECT "Month",COUNT("Name") AS "NumberofStorms" 
     FROM Weather 
     GROUP BY "Month" 
    ) AS Sub 
+0

這與我所期望的很接近。但是,假設我沒有一個名爲「NumberofStorms」的專欄。假設我有一個名爲Weather的表格,其中爲每個風暴創建了一行,其中列爲Month,Storm Name。在這種情況下,我需要一個count()不是嗎? – Canzee

+0

當然,你只需要使用cte/subquery來計數,然後執行總計。查看更新。 –

0

你可以做沒有子查詢的累計和。如果NumberOfStorms是原始數據的一部分:

SELECT "Month", "NumberofStorms", 
     SUM(NumberofStorms) OVER (ORDER BY "Month" ROWS BETWEEN unbounded preceding and current row) AS CumulativeSum 
FROM Weather 
GROUP BY "Month", NumberOfStorms; 

而且,在許多數據庫中,該row條款是不必要的,所以下面也應該工作:

SELECT "Month", "NumberofStorms", 
     SUM(NumberofStorms) OVER (ORDER BY "Month") as CumulativeSum 
FROM Weather 
GROUP BY "Month", NumberOfStorms; 

如果NumberOfStorms真的來自count(*),然後你會這樣做:

SELECT "Month", count(*) as "NumberofStorms", 
     SUM(count(*)) OVER (ORDER BY "Month") as CumulativeSum 
FROM Weather 
GROUP BY "Month"; 

首先,看看累加和與窗口/分析函數的組合看起來有點奇怪,你很快就會習慣它。

+0

你不必每個月都用count()來獲得每月風暴的數量嗎? – Canzee

+0

@Canzee。 。 。如果你想要每月的暴風雨數量,那麼你可以在'select'子句中添加'COUNT(*)作爲StormsPerMonth'。我明白,這是問題的明確部分。我專注於累積部分。我感到困惑的是原始數據中的'NumberOfStorms'部分? –

+0

原始表格天氣僅包含「月份」和「StormName」列。表中沒有NumberofStorms。 – Canzee