【问题标题】:Distinguish between NULL's when using "group by ... with rollup"使用“group by ... with rollup”时区分 NULL
【发布时间】:2012-03-01 07:30:39
【问题描述】:

当我使用group by ... with rollup 运行查询时:

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

我在(我认为是)查询的 PK(即分组列)中得到重复的行:

+------+------+--------+
| 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) 也就是说,我如何区分由于基础数据而具有空值的行和因为它是空值的行通过汇总添加? (注意还有更多例子——(2, NULL, 6)(2, NULL, 40)

【问题讨论】:

    标签: mysql sql group-by rollup


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      Cade Roux 的回答对我不起作用(MySQL v5.1),而且版本之间似乎不一致。 MySQL 文档 cmets 上提出的一种方法是我见过的唯一可靠的方法:

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

      Peter Kioko 于 2012 年 6 月 27 日下午 2:04 发布

      如果您正在对数据包含 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 值相同的行都是汇总行,反之亦然。

      【讨论】:

      • 在 select 语句中读取和写入同一个变量是未定义的行为。
      猜你喜欢
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      • 2021-03-02
      • 1970-01-01
      • 2011-06-20
      • 2016-03-29
      相关资源
      最近更新 更多