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

MySQL中结合DISTINCT、COUNT、SUM与GROUP BY的婚纱销售统计问题

我来帮你搞定这个重复记录导致统计失真的问题!

你的原SQL语句没考虑到同一件婚纱有多名店员参与销售时产生的重复条目——COUNT(*)会把每条店员的记录都算成一次销售,SUM(preis)也会重复累加同一件婚纱的价格,结果肯定不准。

解决的关键是先把重复的销售记录过滤掉:毕竟同一件婚纱不管多少店员参与,只能算一次销售对吧?下面是两种靠谱的修正方案:

方案一:使用唯一标识字段(推荐)

如果你的表中有能唯一标识单条婚纱销售的字段(比如产品IDprodukt_id、订单号bestellnr这类),用它来去重是最准确的:

SELECT 
    YEAR(datum + INTERVAL 3 MONTH) AS Year,
    SUM(preis) AS Total_Price,
    COUNT(*) AS Total_Number
FROM (
    -- 子查询先提取所有唯一的婚纱销售记录,去掉店员重复的条目
    SELECT DISTINCT 
        datum,
        preis,
        produkt_id -- 替换成你表中实际的唯一标识字段
    FROM wccrm_prov 
    WHERE typ IN ('BridalGown', 'Brautkleid') -- 同时匹配英文和德文的婚纱类型标识
) AS unique_bridal_sales
GROUP BY Year 
ORDER BY Year ASC;

逻辑说明

  • 子查询里的DISTINCT会自动去掉同一件婚纱的重复记录(不管有多少店员参与,只保留一条有效销售记录)。
  • 外层查询按照你的年度规则(9月至次年9月,通过YEAR(datum + INTERVAL 3 MONTH)把日期偏移3个月后取年份)分组统计,这样得到的Total_Number是实际销售的婚纱件数,Total_Price是精准的总销售额。

方案二:无唯一标识字段的替代写法

如果你的表没有单独的唯一标识字段,也可以用多个字段的组合来做去重(比如日期+价格+类型的组合,虽然不如唯一ID可靠,但能临时解决问题):

SELECT 
    YEAR(datum + INTERVAL 3 MONTH) AS Year,
    SUM(DISTINCT preis) AS Total_Price,
    COUNT(DISTINCT CONCAT(datum, '_', preis, '_', typ)) AS Total_Number
FROM wccrm_prov 
WHERE typ IN ('BridalGown', 'Brautkleid')
GROUP BY Year 
ORDER BY Year ASC;

内容的提问来源于stack exchange,提问作者Bosstone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:33:17