SQL Server 2012中WBS结构表的动态列分类求解
解决SQL Server 2012中WBS结构表的动态列分类问题
针对你提到的WBS结构表转横向层级列的需求,我给你两种实用的解决方案,适配不同的场景:
一、固定层级的静态实现(适合已知最大层级的场景)
如果你的WBS结构确定最多只有3级,直接用CASE WHEN就能快速达成需求,逻辑清晰易懂:
SELECT CASE WHEN level = 1 THEN id ELSE NULL END AS level1, CASE WHEN level = 2 THEN id ELSE NULL END AS level2, CASE WHEN level = 3 THEN id ELSE NULL END AS level3, parentid, name FROM YourWBSTableName; -- 替换成你的实际表名
结果说明
执行后完全符合你要的格式:
- 根节点(level=1)仅在
level1列填充id,level2、level3为null - 二级节点(level=2)仅在
level2列填充id,其余层级列留空 - 三级节点同理,只在对应层级的列显示id
二、动态层级的自适应实现(适合层级不固定的场景)
如果你的WBS层级可能扩展(比如以后新增level4、level5),静态写法就不够灵活了,这时候用动态SQL可以自动适配所有层级:
DECLARE @MaxLevel INT, @SQL NVARCHAR(MAX); -- 获取表中最大的层级数 SELECT @MaxLevel = MAX(level) FROM YourWBSTableName; -- 拼接动态列的CASE语句 SET @SQL = N'SELECT '; WHILE @MaxLevel >= 1 BEGIN SET @SQL = @SQL + N'CASE WHEN level = ' + CAST(@MaxLevel AS NVARCHAR) + N' THEN id ELSE NULL END AS level' + CAST(@MaxLevel AS NVARCHAR) + N','; SET @MaxLevel = @MaxLevel - 1; END -- 拼接固定列并移除末尾多余的逗号 SET @SQL = LEFT(@SQL, LEN(@SQL)-1) + N', parentid, name FROM YourWBSTableName;'; -- 执行动态生成的SQL EXEC sp_executesql @SQL;
逻辑说明
- 先查询表中最大层级,确定需要生成多少个
levelN列 - 循环拼接每个层级对应的
CASE表达式,自动生成列名和判断逻辑 - 最后拼接固定的
parentid和name列,执行动态SQL即可
这样不管WBS有多少层级,都能自动生成对应的横向列,不用手动修改代码。
内容的提问来源于stack exchange,提问作者Yoseph
相关产品推荐
相关产品推荐

