MySQL GROUP BY WITH ROLLUP - 想要ROLLUP所有排列

时间:2012-07-01 22:16:02

标签: mysql sql

以此表为例(我们称之为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,如果重要的话)

2 个答案:

答案 0 :(得分:1)

不,我相信UNION是唯一的方法。但是,您可以使用UNION ALL(而不是隐式UNION DISTINCT)来避免不必要地搜索重复项。

答案 1 :(得分:-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条记录是汇总排列。 我认为它会使性能更好。

谢谢,