首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在类似Sum()的sql函数中使用减号而不是加号

如何在类似Sum()的sql函数中使用减号而不是加号
EN

Stack Overflow用户
提问于 2008-11-11 10:10:38
回答 5查看 14K关注 0票数 3

我在sql语句中有一个group by子句,并且需要使用聚合函数来减去每个组中的所有值,而不是像Sum()函数那样进行加法运算。

代码语言:javascript
复制
SELECT Sum(A) 
FROM (  
  SELECT 2 AS A
  UNION 
  SELECT 1) AS t1

..so将评估2+1并返回3。

我需要一些2-1的方法来返回1。

希望这是有意义的。我能想到的唯一方法就是使用CLR集成来创建我自己的聚合函数。

还有其他想法吗?

EN

回答 5

Stack Overflow用户

发布于 2008-11-11 10:12:56

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

一旦确定了这个值,它就是一个乘以-1SUM(),然后与该值相加。

编辑:

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

代码语言:javascript
复制
select top 1 @var = [value]
from myTable 
order by [some condition] 

select @minused = (2 * @var)  - sum([value]) 
from myTable 
票数 2
EN

Stack Overflow用户

发布于 2008-11-11 10:38:07

从你的问题看,你想做什么并不是很清楚。如果你想要所有值的和就好像它们是负的,那么你可以执行一个SUM(),然后乘以-1返回一个负的结果。

在您的示例中,您似乎希望获得表中第一行的总和,减去所有其他值。因此,如果你有10,15,5,20的值,你会想要: 10 - 15 -5- 20。这个值与10 - (15 +5+ 20)相同。您可以使用LIMIT获取表中的第一行。我们还需要下一阶段的主键:

代码语言:javascript
复制
SELECT primary_key AS pk, field FROM table LIMIT 1;

我们可以通过排除上述行来获得所有其他行的总和:

代码语言:javascript
复制
SELECT SUM(field) FROM table WHERE primary_key != pk;

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

票数 2
EN

Stack Overflow用户

发布于 2008-11-11 14:49:56

读了你的评论,我认为你想要这样的东西:

代码语言:javascript
复制
SELECT SUM(CASE WHEN ROWNUM=1 THEN 2*A ELSE -A END) 
FROM foo

尽管要获得可靠的排序,您可能需要使用另一个select:

代码语言:javascript
复制
SELECT SUM(b) 
FROM (
  SELECT CASE WHEN ROWNUM=1 THEN 2*a ELSE -a END AS b
  FROM foo
  ORDER BY ???
);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/280494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档