2013-05-09 70 views
2

我剛剛瞭解到使用分組集子句,我相信我可以重新編寫一箇舊查詢。目前,它是來自CTE的5個不同分組的聯盟。我知道我應該很容易地將它改變成不同的層次結構,並將它們分組,甚至彙總,但我需要在每個級別或分組中指定一個字面值。我無法向您展示我的實際代碼,但我在下面有一個示例。如何在分組集中使用select語句中的分組子句?

select 
    b.LEVEL_ONE, b.LEVEL_TWO, b.LEVEL_THREE, b.LEVEL_FOUR, b.LEVEL_FIVE, 
    case 
     when (grouping(b.LEVEL_FIVE)=1) then '' 
     when ... 
     when ... 
     when ... 
     when ... 
     when ... 
    end as'LEVEL_TYPE', 
    sum(b.VALUE) as TOTAL 
from 
    BASE b 
where 
    ... 
group by GROUPING SETS(
    (b.LEVEL_ONE, b.LEVEL_TWO, b.LEVEL_THREE, b.LEVEL_FOUR, b.LEVEL_FIVE), 
    (b.LEVEL_ONE, b.LEVEL_TWO, b.LEVEL_THREE, b.LEVEL_FOUR), 
    (b.LEVEL_ONE, b.LEVEL_TWO, b.LEVEL_THREE), 
    (b.LEVEL_ONE, b.LEVEL_TWO, b.LEVEL_FOUR), 
    (b.LEVEL_ONE, b.LEVEL_TWO), 
    (b.LEVEL_ONE, b.LEVEL_TWO) 
) 

這只是我想去的地方的一般想法。我遇到的問題是當我使用第三或第四組分組時,如何指定文字。有任何想法嗎?

編輯:看起來像下面

預期結果行:

LEVEL_ONE | LEVEL_TWO | LEVEL_THREE | LEVEL_FOUR | LEVEL_FIVE | LEVEL_TYPE | TOTAL 

'lvl1' | 'lvl2' | 'lvl3'  | 'lvl4'  | 'lvl5'  | 'LEVEL 5' | (int) 
... 
'lvl1' | 'lvl2' | 'lvl3'  | 'lvl4'  | null  | 'LEVEL 3,4'| (int) 
... 
'lvl1' | 'lvl2' | null  | 'lvl4'  | null  | 'LEVEL 4' | (int) 
... 
'lvl1' | 'lvl2' | 'lvl3'  | null  | null  | 'LEVEL 3' | (int) 
... 
'lvl1' | 'lvl2' | null  | null  | null  | 'LEVEL 2' | (int) 
... 
'lvl1' | null  | null  | null  | null  | 'LEVEL 1' | (int) 
... 
+0

什麼是您的RDBMS(SQL風味)?你能否爲你的例子提供樣本數據和預期結果? – 2013-05-09 13:39:10

+0

SQL Server 2005.示例數據不可用。我的實例中的字段只是整數。預期的結果將包括在內。 – user1281598 2013-05-09 13:54:15

+0

對不起,如果這是一個愚蠢的問題,但爲什麼'(b.LEVEL_ONE,b.LEVEL_TWO)'項目指定兩次?實際上,根據您的預期輸出結果,我認爲您在那裏犯了一個錯誤,而第二項應該只是'(b.LEVEL_ONE)'而已。 – 2013-05-17 05:14:50

回答

0

如果包括SQL DDL和樣本數據你會得到更多更好的答案。以下代碼未經測試。

爲了更好地看到發生了什麼事情,包括爲每個分組集中的一列。

select 
    b.LEVEL_ONE, b.LEVEL_TWO, b.LEVEL_THREE, b.LEVEL_FOUR, b.LEVEL_FIVE, 
    grouping(LEVEL_ONE) grp_lvl1, 
    grouping(LEVEL_TWO) grp_lvl2, 
    grouping(LEVEL_THREE) grp_lvl3, 
    grouping(LEVEL_FOUR) grp_lvl4, 
    grouping(LEVEL_FIVE) grp_lvl5, 
    sum(b.VALUE) as TOTAL 
from 
    BASE b 
where 
    ... 
group by GROUPING SETS(
    (b.LEVEL_ONE, b.LEVEL_TWO, b.LEVEL_THREE, b.LEVEL_FOUR, b.LEVEL_FIVE), 
    (b.LEVEL_ONE, b.LEVEL_TWO, b.LEVEL_THREE, b.LEVEL_FOUR), 
    (b.LEVEL_ONE, b.LEVEL_TWO, b.LEVEL_THREE), 
    (b.LEVEL_ONE, b.LEVEL_TWO, b.LEVEL_FOUR), 
    (b.LEVEL_ONE, b.LEVEL_TWO), 
    (b.LEVEL_ONE, b.LEVEL_TWO) 
); 

我不能確定分組設置你寫道實際上那些你。仔細看看它們。

一旦您檢查該查詢的輸出,您將能夠看到如何構建CASE ... WHEN表達式。它可能最終會看到東西這樣。

(case when (grouping(LEVEL_ONE) = 1) and 
      (grouping(LEVEL_TWO) = 1) and 
      (grouping(LEVEL_THREE) = 1) and 
      (grouping(LEVEL_FOUR) = 1) and 
      (grouping(LEVEL_FIVE) = 1) then 'Some string literal here' 
     when (grouping(LEVEL_ONE) = 0) and 
      (grouping(LEVEL_TWO) = 1) and 
      (grouping(LEVEL_THREE) = 1) and 
      (grouping(LEVEL_FOUR) = 1) and 
      (grouping(LEVEL_FIVE) = 1) then 'Some other string literal here' 
     when ... 
end) LEVEL_TYPE 
+0

對。這就是我最終通過首先研究分組()()子句的輸出並重新排列正確組合的值來解決它的方法。 – user1281598 2013-05-15 14:21:49