如何减去而不是像Sql函数一样添加Sum()

时间:2008-11-11 10:10:38

标签: sql sql-server-2005 aggregate-functions

我在sql语句中有一个group by子句,需要使用聚合函数来减去每个组中的所有值,而不是像Sum()函数那样添加。

即。

SELECT Sum(A) 
FROM (  
  SELECT 2 AS A
  UNION 
  SELECT 1) AS t1

..所以将评估2 + 1并返回3.

我需要某种方式做2-1以返回1.

希望这是有道理的。我能想到这样做的唯一方法就是使用CLR集成来创建我自己的聚合函数。

还有其他想法吗?

5 个答案:

答案 0 :(得分:2)

您如何识别要从中减去的项目?

确定后,SUM()乘以-1,然后再加上该值。

修改:

如果它是第一个被减去的值,则取该值,加倍,然后取掉所有值的总和。 (加倍它会消除将其包含在所有值的总和中的效果。)

select top 1 @var = [value]
from myTable 
order by [some condition] 

select @minused = (2 * @var)  - sum([value]) 
from myTable 

答案 1 :(得分:2)

从你的问题来看,你想要做什么并不是很清楚。如果你想要所有值的总和好像它们是负数那么你可以只执行SUM(),然后乘以-1来返回否定结果。

在您的示例中,您似乎想要获取表中第一行的总和,减去所有其他值。因此,如果你有10,15,5,20的值,你需要:10 - 15 - 5 - 20.这个值与10 - (15 + 5 + 20)相同。您可以使用LIMIT获取表格中的第一行。我们还需要下一阶段的主键:

SELECT primary_key AS pk, field FROM table LIMIT 1;

我们可以通过排除上述行来获得所有其他行的总和:

SELECT SUM(field) FROM table WHERE primary_key != pk;

然后,您可以从第一个值中减去第二个值。

答案 2 :(得分:2)

阅读你的评论,我想你想要这样的事情:

SELECT SUM(CASE WHEN ROWNUM=1 THEN 2*A ELSE -A END) 
FROM foo

虽然要获得可靠的订购,但您可能需要使用另一个选择:

SELECT SUM(b) 
FROM (
  SELECT CASE WHEN ROWNUM=1 THEN 2*a ELSE -a END AS b
  FROM foo
  ORDER BY ???
);

答案 3 :(得分:0)

SUM()的工作原理是2 + 1 == 1 + 2,而2-1!= 1-2,所以当ORDER BY发生变化时,如果它存在,这样的函数会产生不同的结果。

答案 4 :(得分:0)

我不确定你为什么要这样做,但我只是将所返回数据的负值相加:

SELECT Sum(A) 
FROM (  
  SELECT (2 * -1) AS A
  UNION 
  SELECT (1)) AS t1