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
相关产品推荐
相关产品推荐

