2010-02-04 71 views
1

我有以下數據:分組分層數據(parentID + ID)和運行總和?

ID parentID Text  Price 
1     Root 
2  1   Flowers 
3  1   Electro 
4  2   Rose  10 
5  2   Violet  5 
6  4   Red Rose 12 
7  3   Television 100 
8  3   Radio  70 
9  8   Webradio 90 

我想組報告服務2008年這一數據,並每1級(花/電)的組的價格之和爲0級(根) 。

我有一個表[ID]與[parendID]的遞歸父母分組,並且我能夠計算級別0的總和(只是在組外的另一行),但不知何故,我是無法爲每個組創建總和,因爲SRSS可以「創建」每個級別的組。我想要的結果看起來像這樣:

ID Text  Price 
1  Root 
|2 Flowers 
|-4 Rose  10 
|-5 Violet  5 
| |-6 Red Rose 12 
|  Group Sum-->27 
|3 Electro 
|-7 Television 100 
|-8 Radio  70 
    |-9 Webradio 90 
     Group Sum-->260 
---------------------- 
Total    287 

(只是增加了水平澄清ID的壓痕)

與我目前的做法,我不能拿到小組第一的款項,所以我想通了,我需要以下數據結構:

ID parentID Text  Price level0 level1 level2 level3 
1     Root     1 
2  1   Flowers    1   1 
3  1   Electro    1   2 
4  2   Rose  10  1   1   1 
5  2   Violet  5  1   1   2 
6  4   Red Rose 12  1   1   1   1 
7  3   Television 100  1   2   1 
8  3   Radio  70  1   2   2 
9  8   Webradio 90  1   2   2   1 

具有上述結構我可以創建0級的外合併,與子分組相應級別1,級別2,級別3時。如果現在在級別1上有一個「組總數」,並且組外的總數完全是我想要的。

我的問題是: 如何既達到我期望的結果與我目前的數據結構,或如何將我的當前數據結構(?左外連接)進入「新的數據結構」暫時 - 所以我可以從臨時表中運行我的報告?

感謝你的時間, 丹尼斯

+0

你可以有遞歸限制嗎?你在例子中提到了4個級別。如果限制,你可以盲連4次,否則你可能不得不做一個函數或添加一個「LevelNumber」列。 – 2010-02-04 18:24:02

+0

4個級別是最大的,我應該指定 – 2010-02-05 10:14:58

+0

認爲你可能會得到更多的迴應,如果你將它標記爲't-sql' – 2010-03-09 16:20:42

回答

0

我發現了一種非常難看的方式來做我想做的事 - 也許有更好的方法?的這個

SELECT A.Text, A.Price,     
    CASE 
    WHEN D.Text IS NULL 
    THEN 
     CASE 
      WHEN C.Text IS NULL 
      THEN 
       CASE 
        WHEN B.Text IS NULL 
        THEN 
         A.ID 
        ELSE B.ID 
       END 
      ELSE C.ID 
      END 
    ELSE D.ID 
    END 
    AS LEV0, 

    CASE 
    WHEN D.Text IS NULL 
    THEN 
     CASE 
      WHEN C.Text IS NULL 
      THEN 
       CASE 
        WHEN B.Text IS NULL 
        THEN 
         NULL 
        ELSE A.ID 
       END 
      ELSE B.ID 
      END 
    ELSE C.ID 
    END 
    AS LEV1, 

    CASE 
    WHEN D.Text IS NULL 
    THEN 
     CASE 
      WHEN C.Text IS NULL 
      THEN 
       NULL 
      ELSE A.ID 
      END 
    ELSE B.ID 
    END 
    AS LEV2, 

    CASE 
    WHEN D.Text IS NULL 
    THEN NULL 
    ELSE A.ID 
    END 
    AS LEV3 

FROM   dbo.testOld AS A LEFT OUTER JOIN 
        dbo.testOld AS B ON A.parentID = B.ID LEFT OUTER JOIN 
        dbo.testOld AS C ON B.parentID = C.ID LEFT OUTER JOIN 
        dbo.testOld AS D ON C.parentID = D.ID 

輸出是:

Text  Price  LEV0  LEV1  LEV2  LEV3 
---------- ----------- ----------- ----------- ----------- ----------- 
Root  NULL  1   NULL  NULL  NULL 
Flowers NULL  1   3   NULL  NULL 
Electro NULL  1   4   NULL  NULL 
Television 100   1   4   5   NULL 
Radio  70   1   4   6   NULL 
Rose  10   1   3   7   NULL 
Violet  5   1   3   8   NULL 
Webradio 90   1   4   5   14 
Red Rose 12   1   3   7   15 

利用這種結構我可以繼續對LEV0-3列包括每個組的小計創建4個嵌套組(如在我的期望的結果如上所示) 。

1
WITH q AS 
     (
     SELECT id, parentId, price 
     FROM mytable 
     UNION ALL 
     SELECT p.id, p.parentID, q.price 
     FROM q 
     JOIN mytable p 
     ON  p.id = q.parentID 
     ) 
SELECT id, SUM(price) 
FROM q 
GROUP BY 
     id 

更新:

的測試腳本來檢查:

DECLARE @table TABLE (id INT NOT NULL PRIMARY KEY, parentID INT, txt VARCHAR(200) NOT NULL, price MONEY) 

INSERT 
INTO @table 
SELECT 1, NULL, 'Root', NULL 
UNION ALL 
SELECT 2, 1, 'Flowers', NULL 
UNION ALL 
SELECT 3, 1, 'Electro', NULL 
UNION ALL 
SELECT 4, 2, 'Rose', 10 
UNION ALL 
SELECT 5, 2, 'Violet', 5 
UNION ALL 
SELECT 6, 4, 'Red Rose', 12 
UNION ALL 
SELECT 7, 3, 'Television', 100 
UNION ALL 
SELECT 8, 3, 'Radio', 70 
UNION ALL 
SELECT 9, 8, 'Webradio', 90; 

WITH q AS 
     (
     SELECT id, parentId, price 
     FROM @table 
     UNION ALL 
     SELECT p.id, p.parentID, q.price 
     FROM q 
     JOIN @table p 
     ON  p.id = q.parentID 
     ) 
SELECT t.*, psum 
FROM (  
     SELECT id, SUM(price) AS psum 
     FROM q 
     GROUP BY 
       id 
     ) qo 
JOIN @table t 
ON  t.id = qo.id 

這裏的結果:

1  NULL Root   NULL 287,00 
2  1  Flowers   NULL 27,00 
3  1  Electro   NULL 260,00 
4  2  Rose   10,00 22,00 
5  2  Violet   5,00 5,00 
6  4  Red Rose  12,00 12,00 
7  3  Television  100,00 100,00 
8  3  Radio   70,00 160,00 
9  8  Webradio  90,00 90,00 
+0

有趣,但是我得到的所有數據都是當前ID的總和 - 沒有分組輸出。我的輸出是(用文本替換ID):電視100,電臺70,紫羅蘭5等等,所以基本上就是物品的價格。 SSMS 2008轉換的查詢 符合Q AS(選擇文本,的parentID,價格從 dbo.testOld UNION ALL SELECT p.Text,p.parentID,NULL AS nullablecolumn 自Q AS Q_2 INNER JOIN dbo.testOld AS p ON p.ID = q_2.parentID) SELECT Text,SUM(Price)AS sumprice FROM q AS q_1 GROUP BY文本 – 2010-02-05 10:41:36

+0

@moontear:對,查詢中有一個小錯誤。查看帖子更新。 – Quassnoi 2010-02-05 11:13:46

+0

那裏有一些嚴重的SQL掌握!不幸的是,這不是我正在尋找的解決方案。你提出了一個正確的方法來創建每層次的層次總和,但我真正需要的是一種在層次結構層次上創建分組的方法。我需要能夠對每個級別進行分組,因此我可以讓報告服務負責計算總和。這可能與我的第二個示例數據結構 - 我只是沒有這種結構,並需要一種方法來臨時創建此結構或以某種方式指示報告服務使用不同的組。 – 2010-02-05 16:43:29