【问题标题】:MySQL - Sum only if all rows are not null, else return nullMySQL - 仅当所有行都不为空时求和,否则返回空
【发布时间】:2014-04-19 08:33:57
【问题描述】:

假设如下表:

 X   VALUE
 1   2
 1   3
 2   NULL
 2   4

我想要一个按 X 和 VALUE 之和分组的结果集,但前提是与每个 X 值相关的所有行都不为空。

使用同样的例子,结果必须是:

X   SUM(VALUE)
1   5

如您所见,X=2 由于(2, NULL) 元组而未被选中。

只要可能,我希望不使用子查询。

非常感谢!

【问题讨论】:

    标签: mysql null sum rows


    【解决方案1】:

    您可以通过以下方式实现:

    SELECT 
      x, 
      SUM(value) 
    FROM 
      t 
    GROUP BY 
      x 
    HAVING 
      COUNT(value)=COUNT(*)
    

    这将按照以下方式工作:以正常方式对值进行分组,然后将整个计数(所以 * 指向那个)与列计数(不包括 NULL-s)进行比较。如果它们不相等,则存在 NULL 并且不应包含值。

    【讨论】:

    • 我希望我能投票两次。谢谢,很好的答案 - 简单但不明显
    【解决方案2】:

    这完全可行:

    SELECT SUM(value) FROM test WHERE value IS NOT NULL GROUP BY X
    

    【讨论】:

    • 你检查你的答案了吗?
    • 这只会从整个组中排除NULL,但不会影响计算聚合结果时的非空值
    【解决方案3】:

    另一种方式是这样。它可能会也可能不会更快:

    SELECT X, IF(SUM(VALUE is NULL), NULL, SUM(VALUE)) as value
    FROM table_name
    group by X
    having not(null <=> value);
    

    此外,使用此方法,如果您删除 having 子句,您将获得所有行,但对于带有空值的求和列的空值,您可以有条件地在脚本中执行其他操作。

    http://sqlfiddle.com/#!2/f769cc/18

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      相关资源
      最近更新 更多