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

如何基于采购金额非唯一、(年,月)唯一条件统计Table1销售金额总和?

问题分析与正确SQL实现

原SQL的问题

你的SQL逻辑完全偏离需求,核心问题有两点:

  1. 条件2判断错误:子查询里的HAVING COUNT(*)=1是统计每个(id, year, month)分组的行数,但需求是整个表中(Year, Month)组合唯一(即该年月组合在全表只出现一次),两者逻辑完全不匹配。
  2. 条件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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:33:25