通常,我們在寫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"值來代替。