大大毛 的笔记

  DDM's Note

哪怕没有办法一定有说法,
就算没有鸽子一定有乌鸦,
固执无罪 梦想有价,
让他们惊讶.

posts - 14, comments - 23, trackbacks - 0, articles - 58
   :: 首页 ::  :: 联系 ::  :: 管理

分类小计的实现

Posted on 2007-05-04 11:52 大大毛 阅读(328) 评论(0)  编辑  收藏 所属分类: SQL

問題:

      分類小計的情況很多,通常情況下我們可能會在SQL的外部來實現分類小計,但是相比直接使用SQL得到滿意的結果集來說效率上就會差太多,現在就來解決它好了。先看表結構:
 
表結構及示例數據
      可以看到這3個層表現出的是一個3層的結構,tbCategory 是第一層代表大的類別 tbType 是第二層代表出版物的類型 tbBook 是最下一層,現在我們想要實現分類匯總,需要實現下面的效果:
效果表:
名稱 金額 數量
生物 118.4 3
  印刷品 113.4 2
    昆蟲學 23.5 1
    海洋生物探索 89.9 1
  電子書 5 1
    昆蟲學 5 1
      從這張效果表可以看到,我們需要對數據分類匯總才能實現如上表的效果。


解決:

      平時如果只是2層的關係,直接在SQL語句中實現 Group By 關鍵字即可以實現,但是現在的3層呢?答案是相同的,只是需要將2次匯總的結果集 Union 就好,下面將步驟分解來看:
      1. 我們先對類別實施匯總
Select
        cID,
Sum (price)  as  price, Count ( * as  bookCount
    
From
 
        tbBook
    
Group   By

        cID
      2. 我們再對出版物的類別匯總
Select
        cID,tID,
Sum (price)  as  price, Count ( * as  bookCount
    
From

        tbBook
    
Group   By
        cID,tID
      3. 將上面兩條 SQL Union
Select
        cID,
''   as  tID, Sum (price)  as  price, Count ( * as  bookCount
    
From
 
        tbBook
    
Group   By

        cID
Union
Select
        cID,tID,
Sum (price)  as  price, Count ( * as  bookCount
    
From

        tbBook
    
Group   By
        cID,tID
Order   By
    cID,tID
      出來的結果是這樣:
cID tID price bookCount
1 0 118.4 3
1 1 113.4 2
1 2 5 1
2 0 157.8 4
2 1 136 2
2 2 21.8 2
3 0 235.5 3
3 1 235.5 3
      4. 代入類別名稱和出版物類型的名稱並 Union tbBook表的記錄,得到最終的結果集,为了能够达到排序的效果,我们会在这一步插入一个标识列,用它来控制显示的顺序:
Select   ' 0 '   as  flag,tbBook.cID  as  cID, min (tbBook.tID)  as  tID, min (tbCategory.cName)  as  cName, Sum (price)  as  price, Count ( * as  bookCount  From  tbBook  Join  tbCategory  On  tbBook.cID = tbCategory.cID  Group   By  tbBook.cID
union

Select   ' 1 ' ,tbBook.cID,tbBook.tID, min (tbType.tName), Sum (price)  as  price, Count ( * From  tbBook  Join  tbType  On  tbBook.tID = tbType.tID   Group   By  tbBook.cID,tbBook.tID
union

Select   ' 2 ' ,cID,tID,bName,price, 1   From  tbBook
Order   By  cID,tID,Flag
      這樣即可實現最終的效果了。

只有注册用户登录后才能发表评论。


网站导航:
 

i am ddm