SQL实现字符串多姓名与团队映射分类的问题求助
解决多行姓名映射团队的SQL方案
问题说明
我有一组姓名数据集,部分行里的姓名用换行符(char(10))分隔。需要按以下规则把这些姓名映射到指定团队:
- Maverick队成员:Tony、Sam、Ben
- Lakers队成员:Nick、Savi0、Cruz
规则细节:
- 同一行内所有姓名都属于同一个团队,显示对应的团队名
- 一行里的姓名涉及多个团队,显示“Bundle”
可行SQL方案
假设你的原始数据表名为NameData,包含ID(唯一标识每行)和Names(存储带换行分隔姓名的字段),可以用以下SQL实现需求:
WITH SplitNames AS ( -- 拆分每行中用换行符分隔的姓名,同时清理空格 SELECT nd.ID, TRIM(value) AS SingleName FROM NameData nd CROSS APPLY STRING_SPLIT(nd.Names, CHAR(10)) ), TeamMappings AS ( -- 定义姓名与团队的映射关系,也可以替换成你已有的团队视图 SELECT 'Tony' AS Name, 'Maverick' AS Team UNION ALL SELECT 'Sam', 'Maverick' UNION ALL SELECT 'Ben', 'Maverick' UNION ALL SELECT 'Nick', 'Lakers' UNION ALL SELECT 'Savi0', 'Lakers' UNION ALL SELECT 'Cruz', 'Lakers' ), TeamStats AS ( -- 按原始行分组,统计涉及的不同团队数量 SELECT sn.ID, COUNT(DISTINCT tm.Team) AS UniqueTeamCount, MAX(tm.Team) AS AssignedTeam FROM SplitNames sn LEFT JOIN TeamMappings tm ON sn.SingleName = tm.Name GROUP BY sn.ID ) -- 最终判断输出结果 SELECT nd.ID, nd.Names, CASE WHEN UniqueTeamCount = 0 THEN 'Unknown' -- 处理不在任何团队的姓名,可按需删除 WHEN UniqueTeamCount = 1 THEN AssignedTeam ELSE 'Bundle' END AS ResultTeam FROM NameData nd JOIN TeamStats ts ON nd.ID = ts.ID;
方案解释
- SplitNames:通过
STRING_SPLIT函数把每行的姓名拆分成单独的条目,用TRIM避免拆分后出现多余空格 - TeamMappings:这里直接硬编码了团队成员映射,如果你已经有现成的团队视图,把这部分替换成
SELECT Name, Team FROM 你的团队视图名即可 - TeamStats:按原始行的ID分组,统计该行所有姓名对应的不同团队数量;如果只有一个团队,用
MAX取到这个团队名 - 最终查询:根据统计的团队数量输出结果——只有一个团队就显示团队名,多个团队显示“Bundle”,也可以处理无匹配团队的情况(输出Unknown)
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

