PostgreSQLでは、GROUP BY 列名の代わりにGROUP BY ROLLUP(列名)を使用することで、通常のGROUP BYに加えて、全体の集計結果を出力します。
$ trdsql -driver "postgres" -dsn "dbname=trdsql_test" -oat -ih \
"SELECT class, SUM(score::int) AS score FROM score.csv GROUP BY ROLLUP(class) ORDER BY class"
+-------+------+
| class | sum |
+-------+------+
| A | 585 |
| B | 718 |
| | 1303 |
+-------+------+
MySQL ROLLUP
MySQLでは、GROUP BY 列名の後に WITH ROLLUPを付けると、通常のGROUP BYに加えて、全体の集計結果を出力します。
$ trdsql -driver mysql -oat -ih \
"SELECT class, SUM(CAST(score AS SIGNED)) AS score FROM score.csv GROUP BY class WITH ROLLUP "
+-------+-------+
| class | score |
+-------+-------+
| A | 585 |
| B | 718 |
| | 1303 |
+-------+-------+
$ trdsql -driver "postgres" -dsn "dbname=trdsql_test" -oat -ih \
"SELECT id,name,class, SUM(score::int) AS score " \
" FROM score.csv GROUP BY ROLLUP(class,(id,name)) " \
" ORDER BY class"
$ trdsql -driver mysql -oat -ih \
"SELECT id,GROUP_CONCAT(name) as name,class, SUM(CAST(score AS SIGNED)) AS score " \
" FROM score.csv GROUP BY class,id WITH ROLLUP"
+----+--------------------------------+-------+-------+
| id | name | class | score |
+----+--------------------------------+-------+-------+
| 1 | bob | A | 174 |
| 2 | alice | A | 248 |
| 3 | carol | A | 163 |
| | bob,alice,carol | A | 585 |
| 4 | dave | B | 289 |
| 5 | eve | B | 157 |
| 6 | flank | B | 272 |
| | dave,eve,flank | B | 718 |
| | bob,alice,carol,dave,eve,flank | | 1303 |
+----+--------------------------------+-------+-------+