【发布时间】: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) 元组而未被选中。
只要可能,我希望不使用子查询。
非常感谢!
【问题讨论】:
假设如下表:
X VALUE
1 2
1 3
2 NULL
2 4
我想要一个按 X 和 VALUE 之和分组的结果集,但前提是与每个 X 值相关的所有行都不为空。
使用同样的例子,结果必须是:
X SUM(VALUE)
1 5
如您所见,X=2 由于(2, NULL) 元组而未被选中。
只要可能,我希望不使用子查询。
非常感谢!
【问题讨论】:
您可以通过以下方式实现:
SELECT
x,
SUM(value)
FROM
t
GROUP BY
x
HAVING
COUNT(value)=COUNT(*)
这将按照以下方式工作:以正常方式对值进行分组,然后将整个计数(所以 * 指向那个)与列计数(不包括 NULL-s)进行比较。如果它们不相等,则存在 NULL 并且不应包含值。
【讨论】:
这完全可行:
SELECT SUM(value) FROM test WHERE value IS NOT NULL GROUP BY X
【讨论】:
NULL,但不会影响计算聚合结果时的非空值
另一种方式是这样。它可能会也可能不会更快:
SELECT X, IF(SUM(VALUE is NULL), NULL, SUM(VALUE)) as value
FROM table_name
group by X
having not(null <=> value);
此外,使用此方法,如果您删除 having 子句,您将获得所有行,但对于带有空值的求和列的空值,您可以有条件地在脚本中执行其他操作。
【讨论】: