SQL单行无嵌套查询实现按客户去重累加利润值方法咨询
客户利润去重求和问题
现有数据集
customer buy profit a laptop 350 a mobile 350 b laptop case 50 c laptop 200 c mouse 200
规则与需求
- 字段规则:无论单个客户对应多少条购买记录,每行的
profit字段值已经是该客户的累计利润,例如客户a的总利润为350,客户c的总利润为200 - 计算要求:必须通过单行代码实现,禁止使用子查询、嵌套查询,也不能单独编写CTE
- 目标结果:对所有客户的利润值去重后求和,期望输出为
350 + 50 + 200 = 600
已尝试的无效方案
之前尝试过窗口分区取最大值、SUM(DISTINCT)写法均无法满足需求,尝试过的代码片段如下:
MAX(profit) OVER (PARTITION BY customer)
实现方案
直接用窗口函数做行级权重折算即可,完全满足无嵌套、无CTE、无单独子查询的单行要求:
同一个客户的所有记录profit值完全相同,把每条记录的利润除以该客户对应的记录条数,再对所有折算后的值求和,就能自动把同客户的多份重复利润折成1份累计值,直接得到去重后的客户利润总和。
单行实现代码:
SELECT SUM(profit / COUNT(*) OVER (PARTITION BY customer)) AS total_customer_profit FROM your_table;
如果使用的数据库存在整数截断问题,可以把
profit替换为profit * 1.0保证计算精度
逻辑校验
- 客户a共2条记录,单条折算值为
350/2 = 175,两条合计贡献350 - 客户b共1条记录,单条折算值为
50/1 = 50,合计贡献50 - 客户c共2条记录,单条折算值为
200/2 = 100,两条合计贡献200 - 最终求和结果正好为600,完全匹配预期
内容的提问来源于stack exchange,提问作者tlqn
相关产品推荐
相关产品推荐

