T-SQL使用聚合函数计算客户订单均值 不足3笔返回NULL时缺失行如何解决
T-SQL语句调整方案
你原来的写法存在三处核心问题:
- 排序方向错误:按
OrderID升序排列后行号最小的是最早的订单,要取最新的3笔需要改为降序排列 - 过滤逻辑写反:
Row_num>3的条件会过滤掉最新的3条记录,保留的是更早的记录,应该改为Row_num<=3 - 缺少全量客户维度:直接从过滤后的订单数据分组,会丢失订单数不足3的客户记录
调整后的正确语句如下:
SELECT c.CustomerID, CASE WHEN COUNT(s.TotalAmount) = 3 THEN AVG(s.TotalAmount) ELSE NULL END AS AverageofLast3_operation FROM -- 先拿到所有客户的唯一列表,保证所有客户都会出现在结果中 (SELECT DISTINCT CustomerID FROM CustomerOperation) c LEFT JOIN ( SELECT CustomerID, TotalAmount, -- 按客户分组,订单ID降序排列,最新的订单行号为1 ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY OrderID DESC) AS Row_num FROM CustomerOperation ) s ON c.CustomerID = s.CustomerID AND s.Row_num <= 3 -- 仅关联每个客户最新的3笔订单 GROUP BY c.CustomerID
逻辑说明:
- 先通过子查询拿到所有客户的唯一ID列表,作为主表保证所有客户都出现在结果里
- 关联的子查询对每个客户的订单按OrderID降序编号,筛选出行号<=3的最新3笔订单
- 用CASE判断当前客户关联到的有效订单数是否刚好为3,是则计算平均值,否则返回NULL,完全符合需求要求
内容的提问来源于stack exchange,提问作者ffdd
相关产品推荐
相关产品推荐

