5

を使用してクエリを実行するとgroup by ... with rollup:

select a, b, sum(c) 
from <table> 
group by a, b with rollup;

クエリの PK (つまり、group-by 列) (と私が考えるもの) で重複する行を取得します。

+------+------+--------+
| a    | b    | sum(c) |
+------+------+--------+
| NULL | NULL |     13 |
| NULL |    1 |      4 |
| NULL |    3 |      8 |
| NULL |    4 |      9 |
| NULL | NULL |     34 |
|    1 |    3 |     17 |
|    1 |    4 |   NULL |
|    1 |   17 |      2 |
|    1 | NULL |     19 |
|    2 | NULL |      6 |
|    2 |    1 |     17 |
|    2 |    3 |     17 |
|    2 | NULL |     40 |
|    4 |   17 |      2 |
|    4 | NULL |      2 |
|    5 | NULL |     11 |
|    5 |    6 |      7 |
|    5 | NULL |     18 |
|   13 |    4 |      2 |
|   13 | NULL |      2 |
|   14 |   41 |      3 |
|   14 | NULL |      3 |
|   18 |    1 |      2 |
|   18 | NULL |      2 |
|   41 |    2 |     17 |
|   41 | NULL |     17 |

... さらに行が続きます ...

との見分け方(NULL, NULL, 13)(NULL, NULL, 34) つまり、基になるデータのために null を持つ行と、ロールアップによって追加されたために null を持つ行をどのように区別すればよいでしょうか? (他にも例があることに注意してください --(2, NULL, 6)および(2, NULL, 40))

4

2 に答える 2

8

良い質問。私が考えることができる1つのオプションは、これを行うことです:

select COALESCE(a, -1) AS a, COALESCE(b, -1) AS b, sum(c) 
from <table> 
group by COALESCE(a, -1), COALESCE(b, -1) with rollup;
于 2012-02-08T20:05:31.467 に答える
0

Cade Roux からの回答は私 (MySQL v5.1) では機能せず、バージョンごとに一貫性がないようです。MySQL ドキュメントのコメントで提案されている方法は、私が見た唯一の信頼できる方法です。

http://dev.mysql.com/doc/refman/5.6/en/group-by-modifiers.html

Peter Kioko によって 2012 年 6 月 27 日に 2:04pm に投稿されました。

データに NULL が含まれる列をグループ化する場合、結果の NULL は、実際のデータ値を示しているのかロールアップされた行を示しているのかがあいまいになります。

行がロールアップされた行であるかどうかを明確に知るために、次のトリックを使用できます。

SET @i = 0;

SELECT @i := @i + 1 AS row_num, year, country, product, SUM(profit) FROM sales GROUP BY year, country, product WITH ROLLUP;

結果セットでは、row_num が前の行の row_num と同じ値である行はロールアップされた行であり、その逆も同様です。

于 2013-01-19T08:39:29.220 に答える