3

我在 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 集成来制作我自己的聚合函数。

还有其他想法吗?

4

5 回答 5

2

您将如何确定要从中减去的项目?

一旦确定了它,它就是SUM()乘以-1然后添加到该值。

编辑:

如果它是第一个被减去的值,则取该值,将其加倍,然后取走所有值的总和。(将其加倍会抵消将其包含在所有值的总和中的效果。)

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

select @minused = (2 * @var)  - sum([value]) 
from myTable 
于 2008-11-11T10:12:56.037 回答
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;

然后,您可以从第一个值中减去第二个值。

于 2008-11-11T10:38:06.813 回答
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 ???
);
于 2008-11-11T14:49:56.213 回答
0

SUM() 的工作原理是 2+1 == 1+2,而 2-1 != 1-2,因此如果 ORDER BY 存在,这样的函数会产生不同的结果。

于 2008-11-11T10:13:39.983 回答
0

我不确定你为什么想要这个,但我只是将返回的数据的负值相加:

SELECT Sum(A) 
FROM (  
  SELECT (2 * -1) AS A
  UNION 
  SELECT (1)) AS t1
于 2008-11-11T10:15:23.270 回答