sql-server – SQL Server查询 – 分组乘法

如果我们有这样的表格:
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

我们如何分组/乘以得到这个?

GrpID     Value

Grp1       30
Grp2       30
Grp3        0
Grp4        8
Grp5        7
Grp6     NULL
Grp7      -10

解决方法

乘以行值与添加行值的对数相同

诀窍是处理零和空值.

好的,现在检查

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',-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 '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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...