我有一个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集成来创建我自己的聚合函数。
还有其他想法吗?
我有一个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集成来创建我自己的聚合函数。
还有其他想法吗?
您如何识别要从中扣除的物品?
一旦确定这是一个SUM()
乘以-1
然后添加到该值。
编辑:
如果它被视为从再取该值,它的两倍减去第一个值,然后带走所有的值的总和。 (加倍它抵消了包括它在所有的值的总和的效果。)
select top 1 @var = [value]
from myTable
order by [some condition]
select @minused = (2 * @var) - sum([value])
from myTable
SUM()的作品,如2 + 1 == 1 + 2,而2-1!= 1-2 ,所以这样的函数在ORDER BY改变时会产生不同的结果,如果它存在的话。
我不知道为什么你要这样,但我算了笔返回的数据的负值:
SELECT Sum(A)
FROM (
SELECT (2 * -1) AS A
UNION
SELECT (1)) AS t1
从你的问题是不完全清楚自己想要什么做。如果你想要所有值的总和就好像它们是负数那么你可以只执行一个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;
然后,您可以减去第二个值从第一个。
阅读您的意见,我想你想是这样的:
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 ???
);
这样不是总是评估为零? – FlySwat 2008-11-11 10:13:20
2-1等于1不为零。 – HAdes 2008-11-11 10:20:43
在你设计的例子中,是的,但是当分组大量数据时,我没有看到你想要做什么。 – FlySwat 2008-11-11 10:27:00