程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQLServer 數據庫的數據匯總完整解析(WITH ROLLUP)

SQLServer 數據庫的數據匯總完整解析(WITH ROLLUP)

編輯:MSSQL

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
        {
           將編碼值用“總計:”調換,將倉庫值用""調換;
           將這一行的著色標示為淡綠色;
        }
        指針移到下一條;
      }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved