2008-11-11 73 views
3

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

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

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

我需要做2-1的一些方法来返回1

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

还有其他想法吗?

+0

这样不是总是评估为零? – FlySwat 2008-11-11 10:13:20

+0

2-1等于1不为零。 – HAdes 2008-11-11 10:20:43

+0

在你设计的例子中,是的,但是当分组大量数据时,我没有看到你想要做什么。 – FlySwat 2008-11-11 10:27:00

回答

2

您如何识别要从中扣除的物品?

一旦确定这是一个SUM()乘以-1然后添加到该值。

编辑:

如果它被视为从再取该值,它的两倍减去第一个值,然后带走所有的值的总和。 (加倍它抵消了包括它在所有的值的总和的效果。)

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

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

SUM()的作品,如2 + 1 == 1 + 2,而2-1!= 1-2 ,所以这样的函数在ORDER BY改变时会产生不同的结果,如果它存在的话。

0

我不知道为什么你要这样,但我算了笔返回的数据的负值:

SELECT Sum(A) 
FROM ( 
    SELECT (2 * -1) AS A 
    UNION 
    SELECT (1)) AS t1 
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

阅读您的意见,我想你想是这样的:

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 ??? 
);