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 回答