加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 08:52:55 所属栏目:MsSql教程 来源:网络整理
导读:如果我们有这样的表格: Grp ValueGrp1 2Grp1 5Grp1 3Grp2 3Grp2 -5Grp2 -2Grp3 4Grp3 0Grp3 1Grp4 -2Grp4 -4Grp5 7Grp5 NULLGrp6 NULLGrp6 NULLGrp7 -1Grp7 10 我们如何分组/乘以得到这个? GrpID ValueGrp1 30Grp2 30Grp3 0Grp4 8Grp5 7Grp6 NULLGrp7 -10
如果我们有这样的表格:
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读