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

创建消除空值的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

代码说明

  1. Cust_agg CTE:按City分组,通过条件聚合直接计算每个城市的New、Returning类型客户的NumItems总和,每个城市仅返回一行数据。
  2. 关联A表:A表的每一行匹配对应城市的预聚合结果,最终返回行数与A表一致(3行),且通过ELSE 0确保无空值。

执行结果

运行后将得到符合要求的输出:

CatQtyCityCntryNewCRetCustTotC
Laptop4BerlinGermany8210
Laptop3LondonEngland257
TV5LondonEngland257

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:48:18