SQL Server如何获取重复销售行对应的交易日期
问题根因
返回行数骤减是分组维度和需求不匹配导致的:
- 原查询仅按
ProductName分组,统计的是每个产品全周期的总销售次数,因此能返回9855条售出超1次的产品结果 - 你修改后的查询把
TransactionDate加入GROUP BY,分组维度变成「产品+交易日期」组合,此时COUNT(*)统计的是同个产品在同一天的销售记录数,只有同天产生多条销售记录的产品才会命中HAVING COUNT(*) > 1的过滤条件,最终仅返回36条结果,和你要获取「所有售出超1次产品的全部交易日期」的需求完全不符。
实现方案
这个场景需要用子查询(或CTE、窗口函数)实现,核心逻辑是先圈定符合「总售出次数>1」的产品范围,再拉取这些产品对应的全量交易明细。
子查询写法(兼容性最好,支持所有SQL环境)
SELECT ps.TransactionDate, ps.ProductName, prod.TotalSalesQty AS QtyOfSales FROM product_sales ps INNER JOIN ( -- 第一步:筛选所有售出次数超1次的产品 SELECT ProductName, COUNT(*) AS TotalSalesQty FROM product_sales WHERE ProductID = 1 AND ProductName IS NOT NULL GROUP BY ProductName HAVING COUNT(*) > 1 ) prod ON ps.ProductName = prod.ProductName WHERE ps.ProductID = 1 AND ps.ProductName IS NOT NULL ORDER BY ps.ProductName, ps.TransactionDate;
窗口函数写法(代码更简洁,支持MySQL8.0+、SQL Server、PostgreSQL等主流新版本数据库)
SELECT TransactionDate, ProductName, QtyOfSales FROM ( SELECT TransactionDate, ProductName, COUNT(*) OVER (PARTITION BY ProductName) AS QtyOfSales FROM product_sales WHERE ProductID = 1 AND ProductName IS NOT NULL ) t WHERE QtyOfSales > 1;
提示:如果业务中存在不同产品重名的情况,建议所有分组、关联逻辑都使用
ProductID作为唯一匹配字段,避免重名导致的数据统计错误。
内容的提问来源于stack exchange,提问作者Al Simmons
相关产品推荐
相关产品推荐

