You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单表多条件分组统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:22:34