如果为正,则对所有项目求和。如果为负,则返回每一个

use*_*140 28 sql-server-2008 sql-server t-sql

我需要找到一种方法来获取SUM()所有正值的所有正值num并返回SUM()所有正数的值和每个负数的单独行。下面是一个示例 DDL:

Create Table #Be
(
    id int
    , salesid int
    , num decimal(16,4)
)

Insert Into #BE Values
    (1, 1, 12.32), (2, 1, -13.00), (3, 1, 14.00)
    , (4, 2, 12.12), (5, 2, 14.00), (6, 2, 21.23)
    , (7, 3, -12.32), (8,3, -43.23), (9, 3, -2.32)
Run Code Online (Sandbox Code Playgroud)

这是我想要的输出(每个 salesid 的正数SUM()和负数得到单独的一行返回):

salesid    num
1          26.32
1          -13.00
2          47.35
3          -12.32
3          -43.23
3          -2.32
Run Code Online (Sandbox Code Playgroud)

Mar*_*rco 26

尝试这个:

SELECT   salesid, sum(num) as num
FROM     #BE
WHERE    num > 0
GROUP BY salesid
UNION ALL
SELECT   salesid, num
FROM     #BE
WHERE    num < 0;
Run Code Online (Sandbox Code Playgroud)

如果您想要sum在一行中的两个值,那么您必须创建一个maxValue(and minValue) 函数并将其用作sum(maxValue(0, num))and sum(minValue(0, num))。这在:SQL Server 中是否有一个 Max 函数,它采用两个值,如 .NET 中的 Math.Max?

  • 我修复了查询。还需要“UNION ALL”,而不是“UNION”。 (8认同)

Jul*_*eur 24

这也有效:

SELECT salesid, SUM(num)
FROM #BE
GROUP BY salesid, CASE WHEN num >= 0 THEN 0 ELSE id END;
Run Code Online (Sandbox Code Playgroud)

假设:

  • Id 从 1 开始,因此它可以使用THEN 0. salesid ELSE salesid+id+1也能用
  • 0 被认为是正数,因此>= 0零是正数还是负数?)。尽管x+0=x似乎=不需要符号,但它有助于记住这种情况并没有被遗忘以及如何处理 0(作为 SUM 或作为单个行)。如果the SUM() of all positive numbers均值SUM of strictly positive numbers(即 >0),则=不需要。

必须用真实的数据和索引进行测试,但只有1次表扫描,在某些情况下性能可能会好一点。

缺少索引似乎对该查询对以下测试数据的影响较小:

SET NO COUNT ON
Create Table #Be(
  id int identity(0,1)
  ,salesid int,num decimal(16,4)
)
INSERT INTO #BE(salesid, num) 
SELECT CAST(rand()*10 as int), rand() - rand()
GO 10000 -- or 100.000
Run Code Online (Sandbox Code Playgroud)