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

如何用GROUP BY和COUNT查询被超过N个不同客户购买的商品

问题解答

一、原SQL报错及逻辑问题修复

核心问题说明

  • 语法错误原因:SQL执行顺序限制,SQL Server中HAVING子句执行优先级高于SELECT子句,无法直接引用SELECT中定义的别名C,必须重复写聚合函数表达式。
  • 逻辑错误原因:你当前按ProductID, CustomerID分组,统计的是「单个客户购买单个商品的次数」,完全不符合「购买单个商品的不同客户数量」的需求。

正确查询SQL(被超过N个不同客户购买的商品)

-- 此处N可替换为你需要的阈值,比如示例中的100
SELECT 
    ProductID,
    COUNT(DISTINCT CustomerID) AS 购买客户数
FROM Purchases
GROUP BY ProductID
HAVING COUNT(DISTINCT CustomerID) > N 
ORDER BY 购买客户数 DESC

如果需要同时返回商品名称、价格等信息,可关联Products表:

SELECT 
    p.ID AS 商品ID,
    p.Name AS 商品名称,
    p.Price AS 商品价格,
    COUNT(DISTINCT pur.CustomerID) AS 购买客户数
FROM Products p
INNER JOIN Purchases pur ON p.ID = pur.ProductID
GROUP BY p.ID, p.Name, p.Price
HAVING COUNT(DISTINCT pur.CustomerID) > N
ORDER BY 购买客户数 DESC

二、30天周期内符合条件的商品查询

只需要在上述查询中增加日期过滤条件即可:

SELECT 
    p.ID AS 商品ID,
    p.Name AS 商品名称,
    COUNT(DISTINCT pur.CustomerID) AS 购买客户数
FROM Products p
INNER JOIN Purchases pur ON p.ID = pur.ProductID
-- 日期过滤默认以当前时间为基准往前推30天,可自行调整时间基准
WHERE pur.PurchaseDate >= DATEADD(DAY, -30, GETDATE())
GROUP BY p.ID, p.Name, p.Price
HAVING COUNT(DISTINCT pur.CustomerID) > N
ORDER BY 购买客户数 DESC

注意:如果你的PurchaseDate字段包含时分秒,DATEADD计算会严格匹配时间点,若需要按自然日期统计,可将字段先转成日期类型再判断:WHERE CAST(pur.PurchaseDate AS DATE) >= DATEADD(DAY, -30, CAST(GETDATE() AS DATE))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 13:06:00