如何在SQL Server 2019中按最后字符将一列拆分为两列?
当然可以实现这个需求!你提到PIVOT需要聚合操作,但其实我们可以用条件聚合的方式来达成目标,这种方法比PIVOT更灵活,完全适配你的场景。
解决思路
核心逻辑是:按Customer_Name、City、zip_code分组,对Region_No字段根据结尾字符(R/B)进行条件判断,分别提取对应的值放到新列中。因为同一个分组下每种类型的Region_No最多只有一个,用MAX()或MIN()这类聚合函数就能忽略NULL,保留我们需要的值。
实现代码
SELECT Customer_Name, City, zip_code, -- 提取以R结尾的Region_No,没有则返回NULL MAX(CASE WHEN RIGHT(Region_No, 1) = 'R' THEN Region_No END) AS Inside_Sales_Region, -- 提取以B结尾的Region_No,没有则返回NULL MAX(CASE WHEN RIGHT(Region_No, 1) = 'B' THEN Region_No END) AS B2B_Region FROM test_17Jan GROUP BY Customer_Name, City, zip_code ORDER BY Customer_Name;
代码说明
RIGHT(Region_No, 1):获取Region_No的最后一个字符,用来判断属于哪一类区域;CASE语句:仅当结尾字符匹配时返回对应的Region_No,否则返回NULL;MAX()聚合函数:在分组中自动忽略NULL值,保留符合条件的Region_No(如果分组内有多个同类型值,会取最大的那个,示例场景下用MIN()效果一致);GROUP BY:将相同客户信息的行合并成一行,展示对应的两类区域编号。
扩展场景(可选)
如果你的业务中存在同一个客户对应多个同类型区域的情况(比如多个R结尾的Region_No),可以用SQL Server 2017+支持的STRING_AGG()函数来拼接所有值:
SELECT Customer_Name, City, zip_code, STRING_AGG(CASE WHEN RIGHT(Region_No, 1) = 'R' THEN Region_No END, ', ') AS Inside_Sales_Region, STRING_AGG(CASE WHEN RIGHT(Region_No, 1) = 'B' THEN Region_No END, ', ') AS B2B_Region FROM test_17Jan GROUP BY Customer_Name, City, zip_code ORDER BY Customer_Name;
运行上述代码后,就能得到你期望的输出格式啦。
内容的提问来源于stack exchange,提问作者Arty155
相关产品推荐
相关产品推荐

