在 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