由於前一段時間胃痛,導致博客園博客都停更了一個月左右。近幾天,胃病終於稍微有所好轉,決定重新寫博文。 前幾天,有個朋友剛好問到本人有關 SQL 語句,大致是原表有兩列,分別為月份、月份銷售額,而需要一條 SQL 語句實現統計出每個月份以及當前月以前月份銷售額和。尼瑪,感覺還是沒有說清,下麵用圖表示。 ...
由於前一段時間胃痛,導致博客園博客都停更了一個月左右。近幾天,胃病終於稍微有所好轉,決定重新寫博文。
前幾天,有個朋友剛好問到本人有關 SQL 語句,大致是原表有兩列,分別為月份、月份銷售額,而需要一條 SQL 語句實現統計出每個月份以及當前月以前月份銷售額和。尼瑪,感覺還是沒有說清,下麵用圖表示。
SQL 測試表腳本
DECLARE @Temp Table ( ID INT, --- 月份 MoneyData Float --- 金額 ) insert INTO @TEMP SELECT 1,100 UNION ALL SELECT 2,200 UNION ALL SELECT 3,300 UNION ALL SELECT 4,400 UNION ALL SELECT 5,500 UNION ALL SELECT 6,600 UNION ALL SELECT 7,600
一 自連接
SELECT A.ID, SUM(B.MoneyData) FROM @Temp A INNER JOIN @Temp B ON A.ID>=B.ID GROUP BY A.ID ------ 重點在於 ON 條件,通過自連接 A.ID >= B.ID ,可獲取所需數據,再通過 GROUP BY 、SUM 即可統計求和
二 開窗函數
SELECT ID, MoneyData, SUM(MoneyData) OVER( ) AS '總銷售額', SUM(MoneyData) OVER( PARTITION BY ID ) AS '月銷售額', SUM(MoneyData) OVER( ORDER BY ID ASC) AS '當月+當月前銷售額' FROM @Temp ---- 此處,使用開窗函數使用更為簡單,不過,其中 SUM() OVER ( ORDER BY ID ASC ) 即可實現以上功能
關於,開窗函數的具體用法,可參考微軟 MSDN 官方 API 文檔,最後,推薦一本開窗函數書:基於 SQL SERVER 2012 視窗函數。
參考:https://msdn.microsoft.com/zh-cn/library/ms173454.aspx