【问题标题】:MySQL rollup when some columns include NULL values某些列包含 NULL 值时的 MySQL 汇总
【发布时间】:2017-05-17 12:31:56
【问题描述】:

我有一个数据集,其中字段将NULL 作为有效值是很常见的。当我想在 MySQL 中使用 ROLLUP 运算符时,这会导致问题,因为我无法区分它作为小计/总计的一部分生成的 NULL 值和数据中的实际 NULL 值。

我目前的查询如下:

SELECT
  COALESCE(car_score, "Total") AS car_score,
  COUNT(DISTINCT id) AS volume
FROM cars_table
GROUP BY
  car_score ASC WITH ROLLUP;

这为我提供了下表:

cars_score   |  volume
---------------------------
Total        |  500
1            |  100
2            |  200
3            |  300
4            |  400
5            |  500
Total        |  2000

当我想要它时:

cars_score   |  volume
---------------------------
NULL         |  500
1            |  100
2            |  200
3            |  300
4            |  400
5            |  500
Total        |  2000

这是一个简单的示例,一旦我为ROLLUP 提供了多个维度,它就会变得更加令人沮丧。我不能只将之前的 NULL 值更改为其他值的原因是我还需要能够聚合应用程序其他部分的数据,因此拥有一个合适的 NULL 对我来说很重要。

【问题讨论】:

    标签: mysql sql rollup


    【解决方案1】:

    一种选择是使用子查询进行包装,该子查询首先替换表示缺失数据的实际NULL 值。然后,使用COALESCE() 将汇总中的NULL 替换为字符串"Total"

    SELECT
        COALESCE(t.car_score, 'Total') AS car_score,
        COUNT(DISTINCT t.id) AS volume
    FROM
    (
        SELECT COALESCE(cars_score, 99) AS car_score, id
        FROM cars_table
    ) t
    GROUP BY t.car_score WITH ROLLUP
    

    在这里,我使用99 作为占位符来指示丢失的汽车分数。除了NULL,你可以使用任何你想要的占位符。

    【讨论】:

    • 这很好用!唯一的问题是它会在我动态创建 SQL 时为我创造更多的工作,但这是一个很好的问题。谢谢!
    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 2021-05-19
    • 2015-07-26
    • 2019-01-02
    • 2017-12-05
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多