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

通常,我們在寫web應用程序中,會經常用到分類數據統計的功能。在一個電子商務網站中,我們往往對銷售的每類商品的銷售額,銷售的數量要進行分類統計。那么,在asp.net中,我們如何用datagrid,一方面顯示數據庫中的數據,一方面又能按類別對數據進行分類統計呢?方法應該有很多種,但在這里,想介紹一種容易被人遺忘的方法,那就是使用MSSQL 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"值來代替。[original text ]【未完待續】

小編說話:如果你想闡述自己的觀點,請在下面的“發表評論”中發言

(責任編輯:趙紀雷)

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗