程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 用ROLLUP進行分類數據統計(一)

用ROLLUP進行分類數據統計(一)

編輯:關於SqlServer

通常,我們在寫web應用程序中,會經常用到分類數據統計的功能。在一個電子商務網站中,我們往往對銷售的每類商品的銷售額,銷售的數量要進行分類統計。那麼,在asp.net中,我們如何用datagrid,一方面顯示數據庫中的數據,一方面又能按類別對數據進行分類統計呢?方法應該有很多種,但在這裡,想介紹一種容易被人遺忘的方法,那就是使用MS SQL SERVER中的roll up語句了。

讓我們先來介紹下ms sql server中的roll up語句。Roll up語句,在對統計的數據既要進行分類求和,又要求其總和時,是十分有用的。Roll up語句必須配合group by使用,舉個例子,比如在northwind數據庫中,為了返回同一目錄下的產品總價格,和庫存量,可以使用如下sql 語句:

SELECT
   CategoryName, 
   SUM(UnitPrice) as UnitPrice, 
   SUM(UnitsinStock) as UnitsinStock 
FROM Products
  INNER JOIN Categories On
  Products.CategoryID = Categories.CategoryID
GROUP BY CategoryName

返回的結果如下

而如果想既列出分類中所有產品,又能分類統計出每個分類的產品,價格統計總數,那麼roll up就大有用武之地了。我們想達到的效果可以用下圖表示:

請注意上表中黃色的部分,比如,

表示meat/poultry這個分類中的產品總價格和數量,這就達到了分類統計的目的,最後一行

表示所有分類中產品的總價格和總的數量。可以看出,roll up的實質就是按列,既對分類求和又求所有分類的總和,但要注意一點,roll up在做分類統計時,會在某些字段插入空值,比如,在

中,rollup在做分類統計時,首先是會以下面的形式出現

那麼如何將這些null值替換掉呢,可以使用下面的語句:

SELECT
 CASE
  WHEN (Grouping(CategoryName)=1) THEN 'MainTotal'
  ELSE CategoryName
 END AS CategoryName,
 CASE
  WHEN (Grouping(ProductName)=1) THEN 'SubTotal'
  ELSE Productname
 END AS ProductName, 
 Sum(UnitPrice) as UnitPrice, 
 Sum(UnitsinStock) as UnitsInStock 
FROM Products
 INNER JOIN Categories On
    Products.CategoryID = Categories.CategoryID
GROUP BY CategoryName, ProductName WITH ROLLUP

其中,使用case when..else 的語句時,當productname一列中遇到有null值時,用"subtotal"來代替,當categoryname一列中遇到有null值時,用"maintotal"值來代替。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved