2011-03-15 62 views
4

对于MySQL,我想要一个返回表达式SUM的查询,除非我希望返回值为NULL,如果包含任何表达式在SUM中是NULL。 (SUM的正常运行是忽略NULL值SQL查询为SUM(表达式)返回NULL,只要包含的值为NULL

下面是说明

CREATE TABLE t4 (fee VARCHAR(3), fi INT); 
INSERT INTO t4 VALUES ('fo',10),('fo',200),('fo',NULL),('fum',400); 

SELECT fee, SUM(fi) AS sum_fi FROM t4 GROUP BY fee 

这正好返回结果集我想到一个简单的测试用例:

fee sum_fi 
--- ------ 
fo  210 
fum 400 

我要的是一个查询返回一个不同的结果集:

fee sum_fi 
--- ------ 
fo NULL 
fum 400 

我想要的是值为re只要包含的值为NULL,就将sum_fi转换为NULL。 (这与SUM集合函数不同,它忽略NULL,并返回非NULL表达式的总和。)

问题:可以使用什么查询来返回所需的结果集?

我没有找到任何内置的聚合函数,表现出这种行为。

+3

与标记的解决方案类似的问题:http://stackoverflow.com/questions/1288953/using-sum-so-that-null-in-columns-make-sum-null – 2011-03-15 13:57:33

+0

谢谢亚伦,我的搜索没有找到那个问题。 – spencer7593 2011-03-17 22:12:53

回答

13

如何使用SUM(fi is NULL)来确定您的数据集中是否有NULL值? 这应该工作:

SELECT fee, IF(SUM(fi is NULL), NULL, SUM(fi)) AS sum_fi FROM t4 GROUP BY fee 
+0

谢谢,这对我来说工作得很好。 – spencer7593 2011-03-15 20:12:58

2

您可以使用此查询:

SELECT fee, 
     IF(COUNT(fi) < (SELECT count(fee) FROM t4 temp2 WHERE temp1.fee = temp2.fee), 
      NULL, SUM(fi)) AS sum_fi 
FROM t4 temp1 GROUP BY fee 

还有这样的解决方案:

SELECT fee, CASE WHEN COUNT(*) = COUNT(fi) THEN SUM(fi) ELSE NULL END AS sum_fi 
FROM t4 GROUP BY fee 

这是我从问题亚伦W¯¯标签的应答所得出作为这个的副本。无可否认,后者的形式看起来比我最初的想法要好。

+0

@ spencer7593:该查询有一个我刚刚修复的错误。你可否确认? – Jon 2011-03-15 13:58:48

+0

我更喜欢第二种形式。在我的实际查询中(而不是测试用例),行源不是一个简单的't4',它是几个连接了几个谓词的表。我不想重复t4行源的规范。 – spencer7593 2011-03-15 15:19:47

+0

谢谢 - 第二种形式对我来说工作得很好。 – spencer7593 2011-03-15 20:13:28