2011-03-31 39 views
0

,我有以下格式的一个简单的SQL表分组:选择总和:通过符号

date | value 
============ 
2010-01-01 | -54 
2010-01-02 | 134 
2010-01-03 | 73 

以下两个SQL查询,我可以选择值的总和,正值的总和之间的区别和负值的总和。

SELECT YEAR(date), SUM(value) FROM table WHERE value > 0 GROUP BY YEAR(date) 

SELECT YEAR(date), SUM(value) FROM table WHERE value < 0 GROUP BY YEAR(date) 

有没有办法在单个SQL查询中做到这一点?

在此先感谢!

回答

4

未测试(不知道的情况下可以在SUM指令中放),但是CASE指令可能会帮:

SELECT 
    YEAR(date), 
    SUM(CASE WHEN value > 0 THEN value ELSE 0 END) as positives_sum, 
    SUM(CASE WHEN value < 0 THEN value ELSE 0 END) as negatives_sum 
FROM 
    table 
GROUP BY 
    YEAR(date) 
+0

适用于END。谢谢! – pruefsumme 2011-03-31 09:16:20

+0

是的,对不起,正如我所说,我没有测试。感谢您的更正:) – 2011-03-31 09:37:28

+1

您可以使用'GREATEST(value,0)'和'LEAST(value,0)'代替条件。基本上是一样的,但有点清洁imo。 – TimE 2015-01-07 23:25:21

2

许多数据库都有一个符号()函数

SELECT YEAR(date), 
     SUM(value) 
    FROM table 
GROUP BY YEAR(date), 
      SIGN(value) 
+0

这有效,但给了我一个正面和负面价值的行。仍然有帮助,我不知道SIGN(..)存在。谢谢。 :) – pruefsumme 2011-03-31 09:11:13

+2

是的,它会产生0的第3行(当然总和为0) – RichardTheKiwi 2011-03-31 09:12:48