我在sql语句中有一个group by子句,并且需要使用聚合函数来减去每个组中的所有值,而不是像Sum()函数那样进行加法运算。
即
SELECT Sum(A)
FROM (
SELECT 2 AS A
UNION
SELECT 1) AS t1..so将评估2+1并返回3。
我需要一些2-1的方法来返回1。
希望这是有意义的。我能想到的唯一方法就是使用CLR集成来创建我自己的聚合函数。
还有其他想法吗?
发布于 2008-11-11 10:12:56
您将如何确定要从中减去的项目?
一旦确定了这个值,它就是一个乘以-1的SUM(),然后与该值相加。
编辑:
如果它是要减去的第一个值,则取该值,将其加倍,然后取去所有值的和。(将其加倍会抵消将其包含在所有值的总和中的效果。)
select top 1 @var = [value]
from myTable
order by [some condition]
select @minused = (2 * @var) - sum([value])
from myTable 发布于 2008-11-11 10:38:07
从你的问题看,你想做什么并不是很清楚。如果你想要所有值的和就好像它们是负的,那么你可以执行一个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;然后,可以从第一个值中减去第二个值。
发布于 2008-11-11 14:49:56
读了你的评论,我认为你想要这样的东西:
SELECT SUM(CASE WHEN ROWNUM=1 THEN 2*A ELSE -A END)
FROM foo尽管要获得可靠的排序,您可能需要使用另一个select:
SELECT SUM(b)
FROM (
SELECT CASE WHEN ROWNUM=1 THEN 2*a ELSE -a END AS b
FROM foo
ORDER BY ???
);https://stackoverflow.com/questions/280494
复制相似问题