我在sql语句中有一个group by子句,需要使用聚合函数来减去每个组中的所有值,而不是像Sum()函数那样添加。
即。
SELECT Sum(A)
FROM (
SELECT 2 AS A
UNION
SELECT 1) AS t1
..所以将评估2 + 1并返回3.
我需要某种方式做2-1以返回1.
希望这是有道理的。我能想到这样做的唯一方法就是使用CLR集成来创建我自己的聚合函数。
还有其他想法吗?
答案 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