2017-01-25 22 views
2

有沒有一種方法來命名分組集?對於每個分組集(顯式定義或根據https://www.postgresql.org/docs/devel/static/queries-table-expressions.html按彙總或多維數據集生成),我想以某種方式在結果列中指定一個名稱。這裏是什麼,我試圖做一個醜陋的即時演示,名稱只是被分組列的列表:postgresql,命名爲分組集?

select *, array_to_string(array_remove(array[case when "A" is null then null else 'A' end, 
              case when "B" is null then null else 'B' end, 
              case when "C" is null then null else 'C' end 
              ],null),',') as grouping_set 
from (values ('a','b','c'), 
       ('aa','bb','cc'), 
       ('aaa',null,'ccc')) as foo("A","B","C") 
group by rollup(1,2,3); 


    A | B | C | grouping_set 
-----+----+-----+-------------- 
a | b | c | A,B,C 
a | b |  | A,B 
a | |  | A 
aa | bb | cc | A,B,C 
aa | bb |  | A,B 
aa | |  | A 
aaa | | ccc | A,C <--------- should be A,B,C 
aaa | |  | A  <--------- should be A,B 
aaa | |  | A 
    | |  | 

但是請注意,有兩行的問題,用箭頭標記:這兩者都包括分組中的列B,但不包含在名稱中,因爲這些組中的B爲空。

任何想法或更好的方法來解決這個問題?

回答

2
SELECT "A", "B", "C", 
     CASE GROUPING("A", "B", "C") 
      WHEN 0 THEN 'A,B,C' 
      WHEN 1 THEN 'A,B' 
      WHEN 3 THEN 'A' 
      ELSE '' 
     END AS grouping_set 
FROM (VALUES ('a','b','c'), 
      ('aa','bb','cc'), 
      ('aaa',null,'ccc') 
    ) AS foo("A","B","C") 
GROUP BY ROLLUP(1,2,3); 

Relevant documentation on grouping sets根據Clodoaldo Neto的回答。

1

Grouping Operations

分組操作與分組集(見第7.2.4節)結合使用,來區分結果行。 GROUPING操作的參數並未實際評估,但它們必須完全匹配相關查詢級別的GROUP BY子句中給出的表達式。位分配最右邊的參數是最不重要的位;如果相應表達式包含在生成結果行的分組集合的分組標準中,則每個位爲0;如果不是,則每個位爲1。

select *, grouping("A","B","C") as grouping_set 
from (values 
    ('a','b','c'), 
    ('aa','bb','cc'), 
    ('aaa',null,'ccc') 
) as foo("A","B","C") 
group by rollup(1,2,3); 
    A | B | C | grouping_set 
-----+----+-----+-------------- 
a | b | c |   0 
a | b |  |   1 
a | |  |   3 
aa | bb | cc |   0 
aa | bb |  |   1 
aa | |  |   3 
aaa | | ccc |   0 
aaa | |  |   1 
aaa | |  |   3 
    | |  |   7 
+0

Laurenz的回答在幾秒鐘內做出它變成你面前,所以我選擇了它,但是這是偉大的,有鏈接的文檔是有幫助的,因爲「分組」是不是谷歌一件容易的事情。 – Sigfried