3

たとえば、次の表を見てください ( と呼びましょうBIN_TABLE):

+------+------+
| A    | B    |
+------+------+
|    0 |    0 |
|    0 |    1 |
|    1 |    1 |
|    1 |    0 |
+------+------+

ロールアップしたいので、次のようにします。

SELECT   A, B, COUNT(*)
FROM     BIN_TABLE
GROUP BY A, B WITH ROLLUP;

そして私は得る:

+------+------+----------+
| A    | B    | COUNT(*) |
+------+------+----------+
|    0 |    0 |        1 |
|    0 |    1 |        1 |
|    0 | NULL |        2 |
|    1 |    0 |        1 |
|    1 |    1 |        1 |
|    1 | NULL |        2 |
| NULL | NULL |        4 |
+------+------+----------+

これは、句WITH ROLLUPに入れたフィールドの順序を使用する方法の例です。GROUP BY

結果に次の行も含めたいと思います。

| NULL |    1 |        2 |
| NULL |    0 |        2 |

これは、ロールアップされたすべての順列があることを意味します。

これに頼らずにこれを行うことは可能ですか:

SELECT   A, B, COUNT(*)
FROM     BIN_TABLE
GROUP BY A, B WITH ROLLUP
UNION
SELECT   NULL, B, COUNT(*)
FROM     BIN_TABLE
GROUP BY B

(問題がある場合は、MySQL 5.6 を使用します)

4

2 に答える 2

1

いいえ、それUNIONが唯一の方法だと思います。ただし、UNION ALL(暗黙的ではなくUNION DISTINCT)使用して、重複を不必要に検索することを防ぐことができます。

于 2012-07-01T23:31:25.913 に答える
-1

ロールアップ修飾子の機能によれば、結果にはすでにすべてのロールアップされた順列があります。


この結果を見てください。

+------+------+----------+
| A    | B    | COUNT(*) |
+------+------+----------+
|    0 |    0 |        1 |
|    0 |    1 |        1 |
|    0 | NULL |        2 |
|    1 |    0 |        1 |
|    1 |    1 |        1 |
|    1 | NULL |        2 |
| NULL | NULL |        4 |
+------+------+----------+

ここで、3 番目のレコードと 6 番目のレコードは、ロールアップされた順列です。
したがって、次の sql で結果を取得できます。

SELECT * from 
    (select a,b,count(*) from 
      bin_table group by a,b with rollup) total 
 order by total.b desc,a;

+------+------+----------+
| a    | b    | count(*) |
+------+------+----------+
|    0 |    1 |        1 |
|    1 |    1 |        1 |
|    0 |    0 |        1 |
|    1 |    0 |        1 |
| NULL | NULL |        4 |
|    0 | NULL |        2 |
|    1 | NULL |        2 |
+------+------+----------+
  7 rows in set (0.01 sec)

ここで、6 番目のレコードと 7 番目のレコードは、ロールアップされた順列です。そして、それがパフォーマンスを向上させると思います。

ありがとう、

于 2012-07-01T23:41:45.043 に答える