PostgreSQLのROLLUP

こちらでROLLUPが考察さているが、PostgreSQLも先月(2016年1月)リリースのversion 9.5でROLLUPをサポートしたので、試す。
PostgreSQLのドキュメントはこちら。みるとわかるけども、PostgreSQLSQL-ServerはSQL標準準拠。MySQLが方言。


サンプルはこちらと同様のもの。

\d ureyuki
     Table "public.ureyuki"
  Column  |  Type   | Modifiers 
----------+---------+-----------
 id       | integer | 
 shurui   | text    | 
 ure_date | date    | 
 seibetsu | text    | 
 ure_su   | integer | 

 SELECT * FROM ureyuki;
 id |    shurui    |  ure_date  | seibetsu | ure_su 
----+--------------+------------+----------+--------
  1 | まんが       | 2016-02-01 | 男       |      4
  2 | まんが       | 2016-02-02 | 男       |      1
  3 | まんが       | 2016-02-02 | 女       |      2
  4 | 情報誌       | 2016-02-05 | 男       |      2
  5 | 情報誌       | 2016-02-03 | 女       |      2
  6 | ファッション | 2016-02-03 | 男       |      1
  7 | ファッション | 2016-02-04 | 女       |      1
(7 rows)

例1

MySQL

SELECT * FROM ( SELECT shurui, SUM(ure_su) sum_su
       FROM   ureyuki
       GROUP BY shurui WITH ROLLUP
     ) SQ
ORDER BY shurui;

は、PostgreSQLの場合、以下のように書く。

SELECT * 
FROM ( SELECT shurui, SUM(ure_su) sum_su
       FROM   ureyuki
       GROUP BY  ROLLUP (shurui)
     ) SQ                                  
ORDER BY shurui DESC;
    shurui    | sum_su 
--------------+--------
              |     13
 情報誌       |      4
 ファッション |      2
 まんが       |      7
(4 rows)

例2

MySQLのquery

SELECT * FROM
 (SELECT shurui, seibetsu, SUM(ure_su)su
  FROM ureyuki
  GROUP BY shurui, seibetsu WITH ROLLUP) SQ
ORDER BY shurui, seibetsu;

PostgreSQLの場合、次のように書く。

SELECT * FROM  (SELECT shurui, seibetsu, SUM(ure_su)su
  FROM ureyuki
  GROUP BY ROLLUP (shurui, seibetsu)) SQ
ORDER BY shurui, seibetsu;
    shurui    | seibetsu | su 
--------------+----------+----
 まんが       | 女       |  2
 まんが       | 男       |  5
 まんが       |          |  7
 ファッション | 女       |  1
 ファッション | 男       |  1
 ファッション |          |  2
 情報誌       | 女       |  2
 情報誌       | 男       |  2
 情報誌       |          |  4
              |          | 13
(10 rows)