如果我们有这样的表格:
Grp Value
Grp1 2
Grp1 5
Grp1 3
Grp2 3
Grp2 -5
Grp2 -2
Grp3 4
Grp3 0
Grp3 1
Grp4 -2
Grp4 -4
Grp5 7
Grp5 NULL
Grp6 NULL
Grp6 NULL
Grp7 -1
Grp7 10
Run Code Online (Sandbox Code Playgroud)
我们如何分组/乘以得到这个?
GrpID Value
Grp1 30
Grp2 30
Grp3 0
Grp4 8
Grp5 7
Grp6 NULL
Grp7 -10
Run Code Online (Sandbox Code Playgroud)
gbn*_*gbn 22
乘以行值与添加行值的对数相同
诀窍是处理零和空值.
好的,现在检查
DECLARE @foo TABLE (GrpID varchar(10), Value float)
INSERt @foo (GrpID, Value)
SELECT 'Grp1', 2
UNION ALL SELECT 'Grp1', 5
UNION ALL SELECT 'Grp1', 3
UNION ALL SELECT 'Grp2', 3
UNION ALL SELECT 'Grp2', -5
UNION ALL SELECT 'Grp2', -2
UNION ALL SELECT 'Grp3', 4
UNION ALL SELECT 'Grp3', 0
UNION ALL SELECT 'Grp3', 1
UNION ALL SELECT 'Grp4', -2
UNION ALL SELECT 'Grp4', -4
UNION ALL SELECT 'Grp5', 7
UNION ALL SELECT 'Grp5', NULL
UNION ALL SELECT 'Grp6', NULL
UNION ALL SELECT 'Grp6', NULL
UNION ALL SELECT 'Grp7', -1
UNION ALL SELECT 'Grp7', 10
SELECT
GrpID,
CASE
WHEN MinVal = 0 THEN 0
WHEN Neg % 2 = 1 THEN -1 * EXP(ABSMult)
ELSE EXP(ABSMult)
END
FROM
(
SELECT
GrpID,
--log of +ve row values
SUM(LOG(ABS(NULLIF(Value, 0)))) AS ABSMult,
--count of -ve values. Even = +ve result.
SUM(SIGN(CASE WHEN Value < 0 THEN 1 ELSE 0 END)) AS Neg,
--anything * zero = zero
MIN(ABS(Value)) AS MinVal
FROM
@foo
GROUP BY
GrpID
) foo
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3817 次 |
| 最近记录: |