如何在SQL的CASE语句中对不同列值进行求和?——客户表组合产品消费总额计算需求及示例SQL求助
解决SQL中产品组合消费总额计算的问题
我来帮你搞定这个需求,先说说你当前查询里的几个小问题,再给你调整出正确的写法~
先看原查询的问题
- 聚合函数的位置不对:你把
SUM()放在了CASE语句里面,而且没有加GROUP BY EmailAddress,这样会导致整个表被聚合为一行,而不是按每个客户单独计算。 - 别名写错了:第三个组合的别名应该是
Movies_Games,你写成了Books_Music,和实际组合不匹配。 - 逻辑顺序问题:如果你的表是每个客户一行,其实不需要用
SUM(),直接对列进行加减操作就可以了;如果是多行为同一客户的消费记录,才需要先聚合再计算。
根据需求的两种正确写法
场景1:每个客户在表中只有一行记录
如果你的Customers表中每个EmailAddress唯一,直接计算对应产品列的和即可。如果需要只统计同时消费了组合内两个产品的客户(比如同时买了Books和Movies才显示总额,否则显示NULL),写法如下:
SELECT EmailAddress, CASE WHEN Books > 0 AND Movies > 0 THEN Books + Movies ELSE NULL -- 要是想没消费的组合显示0,就把NULL改成0 END AS Books_Movies, CASE WHEN Books > 0 AND Games > 0 THEN Books + Games ELSE NULL END AS Books_Games, CASE WHEN Movies > 0 AND Games > 0 THEN Movies + Games ELSE NULL END AS Movies_Games FROM Customers;
如果不管是否同时消费,都要计算组合的总额(比如只买了Books的话,Books_Movies就是Books的金额),那连CASE都可以不用,直接写:
SELECT EmailAddress, Books + Movies AS Books_Movies, Books + Games AS Books_Games, Movies + Games AS Movies_Games FROM Customers;
场景2:同一客户有多条消费记录
如果表中一个客户对应多行数据,需要先按EmailAddress分组,聚合每个产品的总消费,再判断组合情况:
SELECT EmailAddress, CASE WHEN SUM(Books) > 0 AND SUM(Movies) > 0 THEN SUM(Books) + SUM(Movies) ELSE NULL END AS Books_Movies, CASE WHEN SUM(Books) > 0 AND SUM(Games) > 0 THEN SUM(Books) + SUM(Games) ELSE NULL END AS Books_Games, CASE WHEN SUM(Movies) > 0 AND SUM(Games) > 0 THEN SUM(Movies) + SUM(Games) ELSE NULL END AS Movies_Games FROM Customers GROUP BY EmailAddress;
关于CASE语句中列求和的要点
- 单行场景:直接在
CASE的THEN子句里把需要的列相加就行,不需要SUM,因为是针对当前行的计算。 - 多行聚合场景:要先对单个列用
SUM聚合出总额,再在CASE里把聚合后的结果相加,而不是把SUM嵌套在CASE里(原查询的问题就出在这里,嵌套的话只会聚合满足CASE条件的行,不是所有行的总额)。 - GROUP BY必须加:使用聚合函数时,所有非聚合的列(比如
EmailAddress)都要放在GROUP BY中,否则会得到错误结果。
内容的提问来源于stack exchange,提问作者sfmc_newbie
相关产品推荐
相关产品推荐

