如何用SQL计算基于Customer ID出现次数分组的Quantity贡献占比
实现订单组的Quantity贡献百分比计算
没问题,我来帮你一步步搞定这个需求!先结合示例明确下分组逻辑:组1是OrderID仅出现一次的订单组,组2是OrderID出现多次的订单组,接下来分两步实现:
原始数据参考
|ID | OrderID |Quantity |---|-------- |----- |1 |10248 |12 |2 |10248 |10 |3 |10248 |5 |4 |10249 |9 |5 |10249 |40 |6 |10250 |10
第一步:计算每个OrderID的总Quantity
首先我们需要聚合每个订单的总数量,这是后续统计占比的基础:
SELECT OrderID, SUM(Quantity) AS TotalQuantity FROM your_table_name -- 替换成你实际的表名 GROUP BY OrderID;
执行后得到中间结果:
OrderID | TotalQuantity 10248 | 27 10249 | 49 10250 | 10
第二步:计算两组的贡献百分比
这里用CTE(公共表表达式)来实现,逻辑更清晰易懂:
WITH OrderTotals AS ( SELECT OrderID, SUM(Quantity) AS TotalQuantity, -- 标记分组:1=该OrderID仅对应1条订单,2=对应多条订单 CASE WHEN COUNT(*) = 1 THEN 1 ELSE 2 END AS GroupNum FROM your_table_name GROUP BY OrderID ) SELECT GroupNum AS `Group`, -- 计算百分比并格式化,这里取整显示 CONCAT(ROUND((SUM(TotalQuantity) / (SELECT SUM(TotalQuantity) FROM OrderTotals)) * 100), '%') AS `% tot Quantity` FROM OrderTotals GROUP BY GroupNum ORDER BY GroupNum;
执行后就能得到你要的最终结果:
Group | % tot Quantity 1 | 12% 2 | 88%
补充说明
- 如果需要更精确的百分比(比如保留1位小数),可以把
ROUND(...)改成ROUND(..., 1) - 如果你确实是基于Customer ID来分组(原始表可能遗漏了这个字段),只需要调整
CASE里的判断逻辑,比如用COUNT(DISTINCT CustomerID)或者对应分组规则即可。
内容的提问来源于stack exchange,提问作者Andy Wang
相关产品推荐
相关产品推荐

