如何基于采购金额非唯一、(年,月)唯一条件统计Table1销售金额总和?
问题分析与正确SQL实现
原SQL的问题
你的SQL逻辑完全偏离需求,核心问题有两点:
- 条件2判断错误:子查询里的
HAVING COUNT(*)=1是统计每个(id, year, month)分组的行数,但需求是整个表中(Year, Month)组合唯一(即该年月组合在全表只出现一次),两者逻辑完全不匹配。 - 条件1判断错误:外层按
purchase分组后用COUNT(*)>1,统计的是关联后该purchase对应的行数,不是判断purchase在原表中是否重复出现(非唯一)。
正确实现思路
要同时满足两个条件,需先分别定位:
- 非唯一的
purchase值:即该purchase在表中出现次数>1 - 唯一的
(Year, Month)组合:即该年月组合在表中只出现一次
再筛选出同时符合这两个条件的记录,最后求和它们的sales金额。
正确SQL语句
方法1:子查询预计算聚合值
SELECT SUM(t.sales) AS total_sales FROM Table1 t WHERE -- 条件1:purchase非唯一 (SELECT COUNT(*) FROM Table1 WHERE purchase = t.purchase) > 1 -- 条件2:(year, month)组合唯一 AND (SELECT COUNT(*) FROM Table1 WHERE year = t.year AND month = t.month) = 1;
方法2:窗口函数(性能更优)
SELECT SUM(sales) AS total_sales FROM ( SELECT sales, COUNT(*) OVER (PARTITION BY purchase) AS purchase_count, COUNT(*) OVER (PARTITION BY year, month) AS ym_count FROM Table1 ) temp WHERE purchase_count > 1 AND ym_count = 1;
两种方法都能精准筛选目标记录,窗口函数版本在数据量较大时性能表现更好。
内容的提问来源于stack exchange,提问作者phoenix08
相关产品推荐
相关产品推荐

