如何修改SQL Server视图合并同一客户编码的行?
解决方案
错误原因
你收到的View or function 'Zrad_vw_CSR' contains a self-reference错误,是因为SQL Server不允许视图直接或间接引用自身,你的ALTER语句试图从要修改的视图本身查询,违反了这个规则。
正确实现方式
要实现同一custcode对应的CSR和Salesrep显示在同一行,无需依赖原有视图,直接基于原始表使用条件聚合即可完成。以下是修改后的视图创建/修改语句:
方式1:直接基于原始表生成目标视图
CREATE OR ALTER VIEW Zrad_vw_CSR AS SELECT custcode, MAX(fromdate) AS "Recent", -- 提取对应custcode的Salesrep用户编码(usertype=1) MAX(CASE WHEN usertype = 1 THEN usercode END) AS Salesrep, -- 提取对应custcode的CSR用户编码(usertype=0) MAX(CASE WHEN usertype = 0 THEN usercode END) AS CSR FROM [Original Table] GROUP BY custcode;
方式2:保留中间分组逻辑(可选)
如果需要保留第一次视图中按usercode、custcode、usertype分组的逻辑,可以用子查询替代自引用:
CREATE OR ALTER VIEW Zrad_vw_CSR AS SELECT custcode, MAX(Recent) AS "Recent", MAX(CASE WHEN usertype = 1 THEN usercode END) AS Salesrep, MAX(CASE WHEN usertype = 0 THEN usercode END) AS CSR FROM ( SELECT usertype, usercode, custcode, MAX(fromdate) AS "Recent" FROM [Original Table] GROUP BY usercode, custcode, usertype ) AS IntermediateData GROUP BY custcode;
说明
- 条件聚合通过
MAX(CASE...),针对每个custcode分别提取对应类型的用户编码,将原本分行的数据合并到同一行。 MAX(fromdate)确保每个custcode保留最新的日期记录。- 原始表名若包含空格,需用方括号
[Original Table]包裹,符合SQL Server语法要求。
内容的提问来源于stack exchange,提问作者zExcel
相关产品推荐
相关产品推荐

