在 Zite 上看到的「Postgres finally has CUBE / ROLLUP / GROUPING SETS !」。
直接看 PostgreSQL 的文件「7.2.4. GROUPING SETS, CUBE, and ROLLUP」就可以知道用法:
=> SELECT * FROM items_sold; brand | size | sales -------+------+------- Foo | L | 10 Foo | M | 20 Bar | M | 15 Bar | L | 5 (4 rows) => SELECT brand, size, sum(sales) FROM items_sold GROUP BY GROUPING SETS ((brand), (size), ()); brand | size | sum -------+------+----- Foo | | 30 Bar | | 20 | L | 15 | M | 35 | | 50 (5 rows)
結果就是分次 GROUP BY 的聯集。而 CUBE
與 ROLLUP
則是提供列舉的方式。
ROLLUP
的部份:
ROLLUP ( e1, e2, e3, ... )
表示階層式的列舉:
GROUPING SETS ( ( e1, e2, e3, ... ), ... ( e1, e2 ) ( e1 ) ( ) )
而 CUBE
:
CUBE ( a, b, c )
則是表示 power set (所有的組合):
GROUPING SETS ( ( a, b, c ), ( a, b ), ( a, c ), ( a ), ( b, c ), ( b ), ( c ), ( ), )
也有更複雜的 CUBE ( (a,b), (c,d) )
與 GROUP BY a, CUBE(b,c), GROUPING SETS ((d), (e))
可以用,參考文件裡的範例即可 :p