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?
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)
假设:
THEN 0. salesid ELSE salesid+id+1也能用>= 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)
| 归档时间: |
|
| 查看次数: |
21233 次 |
| 最近记录: |