SQLServer 數據庫的數據匯總完整解析(WITH ROLLUP)。本站提示廣大學習愛好者:(SQLServer 數據庫的數據匯總完整解析(WITH ROLLUP))文章只能為提供參考,不一定能成為您想要的結果。以下是SQLServer 數據庫的數據匯總完整解析(WITH ROLLUP)正文
現有表A,內容以下:
編碼 倉庫 數目 01 A 6 01 B 7 02 A 8 02 B 9
如今想按編碼查詢出這類格局:
01 A 6 01 B 7 匯總小計: 13 02 A 8 02 B 9 匯總小計: 17
問:該若何完成?
乍一看,似乎很輕易,用group by似乎能完成?但細心研討下去,你又會認為group by也是力所不及,總完善點甚麼,無從下手。那末,究竟該若何做呢?別急,SQL Server早就幫我們做好了,上面,跟我來。
起首,讓我們來看一段話:
在生成包括小計和算計的報表時,ROLLUP 運算符很有效。ROLLUP 運算符生成的成果集相似於 CUBE 運算符所生成的成果集。
CUBE 運算符生成的成果集是多維數據集。多維數據集是現實數據的擴大,現實數據即記載個體事宜的數據。擴大樹立在用戶盤算剖析的列上。這些列被稱為維。多維數據集是一個成果集,個中包括了各維度的一切能夠組合的穿插表格。
CUBE 運算符在 SELECT 語句的 GROUP BY 子句中指定。該語句的選擇列表應包括維度列和聚合函數表達式。GROUP BY 應指定維度列和症結字 WITH CUBE。成果集將包括維度列中各值的一切能夠組合,和與這些維度值組合相婚配的基本行中的聚合值。
CUBE 和 ROLLUP 之間的差別在於:
CUBE 生成的成果集顯示了所選列中值的一切組合的聚合。
ROLLUP 生成的成果集顯示了所選列中值的某一條理構造的聚合。
看完以上的這段話,悟出了甚麼沒有?假如沒有,那末……嘿嘿,你的悟性還不敷喲,離“三花棸頂”還早著呢:)。接上去我們再看一段(留意喲,謎底立時就揭曉了):
SELECT 編碼, 倉庫, Sum(數目) as 數目 FROM A GROUP BY 編碼, 倉庫 WITH ROLLUP
--症結就是前面的WITH ROLLUP
--固然,你也能夠用WITH CUBE,然則成果會有點不年夜一樣
能夠看完下面這段你照樣認為“雲裡霧裡”,摸不著腦筋。其實不明確也沒緊要,本身著手做。
起首:建一個下面所說的A表,輸出幾行數據;
接著:翻開你的SQL Server查詢剖析器,連上包括你下面所建A表的辦事器,選擇包括該表的數據庫;
然後:Copy下面這段SQL 語句,Paste到查詢剖析器中,按F5,怎樣樣?看到上面出來了甚麼?是否是和我上面的一樣?
編碼 倉庫 數目 01 A 6 01 B 7 01 NULL 13 02 A 8 02 B 9 02 NULL 17 NULL NULL 30
--假如你用的是WITH CUBE,成果集的前面還會多出兩條(假如你也只是輸出示例中的幾行數據的話):
NULL A 14 NULL B 16
咦!奇異,成果中怎樣有那末多“NULL”值?哈,別急,這幾行恰是我們所要的匯總數據行,不好看出:
01 NULL 13恰是對編碼為01的一切倉庫中的數目的匯總;02 NULL 17是對編碼為02的一切倉庫的數目的匯總;
NULL NULL 30是對一切材料行數目的匯總。
若何?謎底出來了吧?是否是很簡略呢?固然,下面還有點十全十美,那就是有很多多少“NULL”的存在。若何去失落這些有意義的NULL呢?上面我們再停止優化。
1、用Grouping調換NULL值
SELECT CASE WHEN (GROUPING(編碼) = 1) THEN 'ALL' ELSE ISNULL(編碼, 'UNKNOWN') END AS 編碼, CASE WHEN (GROUPING(倉庫) = 1) THEN 'ALL' ELSE ISNULL(倉庫, 'UNKNOWN') END AS 倉庫, SUM(數目) AS 數目 FROM A GROUP BY 編碼, 倉庫 WITH ROLLUP
--恰當的應用Case函數
成果我這裡就不寫了,就是把下面的“NULL”值全體換成“ALL”字符串
2、應用法式做進一步的優化
//平日為了顯示上的須要,我們必需對以上SQL語句生成的成果做一些優化,上面給出天然說話描寫:
WHILE(未達到最初一筆記錄){ IF 編碼值不為ALL而倉庫值為ALL { 將編碼值用“小計:”調換,將倉庫值用""調換; 將這一行的色彩標示為灰色; } ELSE 編碼值為ALL倉庫值也為ALL { 將編碼值用“總計:”調換,將倉庫值用""調換; 將這一行的著色標示為淡綠色; } 指針移到下一條; }