创建消除空值的SQL Server(T-SQL)视图遇到问题求助
解决扁平化无空值数据视图的问题
现有两张表A和Cust,无主键/外键关联,仅通过City字段做关联汇总。需要创建一个视图,将Cust表中不同CustType的NumItems汇总后扁平化为NewC、RetCust字段,最终返回3行数据(对应A表的3条记录),但当前编写的视图返回6行。限制条件:不能使用XML技术(团队分析师无法理解),递归CTE尝试失败。
解决方案
核心问题是原代码在CTE中按CustType分组,导致A表的每一行生成两条对应不同CustType的记录,后续聚合无法合并。正确做法是先对Cust表按City预聚合,计算每个城市不同客户类型的NumItems总和,再与A表关联,直接得到每行对应的汇总值,避免多余行。
修改后的视图代码:
ALTER VIEW My_View AS -- 预聚合Cust表,得到每个城市的New和Returning类型NumItems总和 WITH Cust_agg AS ( SELECT City, SUM(CASE WHEN CustType = 'New' THEN NumItems ELSE 0 END) AS NewC, SUM(CASE WHEN CustType = 'Returning' THEN NumItems ELSE 0 END) AS RetCust FROM Cust GROUP BY City ) SELECT A.Cat, A.Qty, A.City, A.Ctry AS Cntry, Cust_agg.NewC, Cust_agg.RetCust, Cust_agg.NewC + Cust_agg.RetCust AS TotC FROM A LEFT JOIN Cust_agg ON A.City = Cust_agg.City GO
代码说明
Cust_aggCTE:按City分组,通过条件聚合直接计算每个城市的New、Returning类型客户的NumItems总和,每个城市仅返回一行数据。- 关联
A表:A表的每一行匹配对应城市的预聚合结果,最终返回行数与A表一致(3行),且通过ELSE 0确保无空值。
执行结果
运行后将得到符合要求的输出:
| Cat | Qty | City | Cntry | NewC | RetCust | TotC |
|---|---|---|---|---|---|---|
| Laptop | 4 | Berlin | Germany | 8 | 2 | 10 |
| Laptop | 3 | London | England | 2 | 5 | 7 |
| TV | 5 | London | England | 2 | 5 | 7 |
内容的提问来源于stack exchange,提问作者Only_me
相关产品推荐
相关产品推荐

