MySQL - 仅当所有行都不为null时才求和,否则返回null

时间:2014-03-14 07:13:44

标签: mysql null sum rows

让我们假设下表:

 X   VALUE
 1   2
 1   3
 2   NULL
 2   4

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

使用相同的示例,结果必须是:

X   SUM(VALUE)
1   5

如您所见,由于X=2元组,未选择(2, NULL)

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

非常感谢!

3 个答案:

答案 0 :(得分:13)

您可以通过以下方式实现这一目标:

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:-1)

这样可行:

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