单表多条件分组统计SQL求助:区分SaleInOut='in'/'out'统计
区分SaleInOut类型的分组统计SQL写法
问题修正与说明
原SQL存在两个问题:一是未区分SaleInOut的in/out类型做分别统计;二是SaleID字段出现在SELECT列表但未纳入GROUP BY(不符合SQL标准,仅部分数据库非严格模式下允许),需同步修正。
正确SQL写法(通用标准)
使用条件聚合实现同一分组内的多维度统计:
SELECT UserID, -- 统计SaleInOut='in'的数量总和 SUM(CASE WHEN SaleInOut = 'in' THEN SaleQuantity ELSE 0 END) AS TOTALQNTYIN, -- 统计SaleInOut='out'的数量总和 SUM(CASE WHEN SaleInOut = 'out' THEN SaleQuantity ELSE 0 END) AS TOTALQNTYOUT, -- 统计SaleInOut='in'的金额总和 SUM(CASE WHEN SaleInOut = 'in' THEN SaleFinalPrice * SaleQuantity ELSE 0 END) AS FINALPRICEIN, -- 统计SaleInOut='out'的金额总和 SUM(CASE WHEN SaleInOut = 'out' THEN SaleFinalPrice * SaleQuantity ELSE 0 END) AS FINALPRICEOUT FROM xxxtemp GROUP BY UserID;
关于SaleID的处理
如果业务需要保留SaleID信息,需根据实际场景用聚合函数处理:
- 若每个
UserID对应唯一SaleID:使用MAX(SaleID)或MIN(SaleID) - 若每个
UserID对应多个SaleID:使用字符串拼接(如MySQL的GROUP_CONCAT)
示例(保留所有关联SaleID):
SELECT GROUP_CONCAT(SaleID SEPARATOR ',') AS SaleIDs, UserID, SUM(CASE WHEN SaleInOut = 'in' THEN SaleQuantity ELSE 0 END) AS TOTALQNTYIN, SUM(CASE WHEN SaleInOut = 'out' THEN SaleQuantity ELSE 0 END) AS TOTALQNTYOUT, SUM(CASE WHEN SaleInOut = 'in' THEN SaleFinalPrice * SaleQuantity ELSE 0 END) AS FINALPRICEIN, SUM(CASE WHEN SaleInOut = 'out' THEN SaleFinalPrice * SaleQuantity ELSE 0 END) AS FINALPRICEOUT FROM xxxtemp GROUP BY UserID;
原理说明
通过CASE WHEN对每条记录的SaleInOut值做判断,仅将符合条件的SaleQuantity或金额计入对应总和,不符合条件的行用0填充,最终在同一行输出每个UserID的两类统计结果,避免多次分组或关联查询的冗余。
内容的提问来源于stack exchange,提问作者MUHAMMED DÖNMEZ
相关产品推荐
相关产品推荐

