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

如何在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;

代码说明

  1. RIGHT(Region_No, 1):获取Region_No的最后一个字符,用来判断属于哪一类区域;
  2. CASE语句:仅当结尾字符匹配时返回对应的Region_No,否则返回NULL;
  3. MAX()聚合函数:在分组中自动忽略NULL值,保留符合条件的Region_No(如果分组内有多个同类型值,会取最大的那个,示例场景下用MIN()效果一致);
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:25:45