如何减去而不是添加像 sql 函数一样的 Sum() [关闭]

Posted

技术标签:

【中文标题】如何减去而不是添加像 sql 函数一样的 Sum() [关闭]【英文标题】:How to minus instead of add in a Sum() like sql function [closed] 【发布时间】:2010-09-21 18:48:47 【问题描述】:

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

还有其他想法吗?

【问题讨论】:

不会总是计算为零吗? 在您的人为示例中是的,但是在对大量数据进行分组时,我看不到您要做什么。 只需尝试减去结果集中的所有值,而不是像 sum() 那样将它们相加。即我想要 1-2-3-4 而不是 1+2+3+4。 你如何选择项目从你减去所有其他? 我不确定您要完成什么。减法只是负数的加法[例如2 + (-1) = 1],所以任何人都需要 SUM() 函数。您可能想重新定义问题。 【参考方案1】:

您将如何识别要从中减去的项目?

一旦确定,它就是SUM() 乘以-1,然后加上那个值。

编辑:

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

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

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

【讨论】:

无需识别任何东西。我只是想取第​​一个值并继续拿走其他所有东西。即 2-1-1-2-3...等等等等。然后我有我的结果,可以绝对它来获得差异。 HAdes,我相信它可以满足您的需求。【参考方案2】:

阅读你的 cmets,我认为你想要这样的东西:

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 ???
);

【讨论】:

刚刚注意到这是一个 SQL Server 问题 - 我以为我在看 Oracle 问题。我会留下我的答案,以防万一。【参考方案3】:

从您的问题来看,您并不清楚您想做什么。如果您希望将所有值的总和视为负数,则只需执行 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;

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

【讨论】:

【参考方案4】:

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

【讨论】:

我明白这一点,但无论如何我都会绝对回答。所以 abs(2-1) 与 abs(1-2) 相同。抱歉,我认为我不需要提及。 这适用于两个值。更多信息,您可以获得 abs(1-2-3) != abs(3-2-1)。【参考方案5】:

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

SELECT Sum(A) 
FROM (  
  SELECT (2 * -1) AS A
  UNION 
  SELECT (1)) AS t1

【讨论】:

我的示例是出于演示目的。我实际上不是在做工会。它只是从 tableA 中选择 sum(A) 所以你不能像你建议的那样否定其中一行。

以上是关于如何减去而不是添加像 sql 函数一样的 Sum() [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何将用户定义的函数应用于变量,就像内置函数一样?

asp.net如何对DataTable 或DataView进行统计,比如像用SQL函数里的Sum统计类似。

如何告诉 SQL 在“出现正值”时返回 TRUE 而不是使用 SUM(field) >0 条件

索引 C# 数据表以像使用 SQL 查询一样进行搜索

MS SQL实时累计流量,得到日、月、年累计

SQL 不是单组分组函数