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