一个字段内容有固定符号分列查询

CF_HN_CN 2015-09-23 01:32:57
姓名 能力类型
张三 “计划/组织/协调能力、沟通能力、分析判断能力、培养他人能力”
李四 “沟通能力、协调能力、学习能力"

想根据上面的内容查询出
姓名 能力1 能力2 能力3 能力4
张三 计划/组织/协调能力 沟通能力 分析判断能力 培养他人能力
李四 沟通能力 协调能力 学习能力

效果跟Excel中的固定符号分列功能一样效果。
...全文
269 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
spiritofdragon 2015-09-23
  • 打赏
  • 举报
回复
with tt (name,ss) as (
select '张三','计划/组织/协调能力、沟通能力、分析判断能力、培养他人能力' union all
select '李四','沟通能力、协调能力、学习能力'
)
,t as(
select tt.name 姓名,ss+'、' 能力类型,LEN(ss+'、')-LEN(REPLACE(ss+'、','、','')) cnt from tt
)
,cte as 
(
select *
	,1 lvl
	,substring(t.能力类型,1,CHARINDEX('、',t.能力类型)-1)单独能力
	,substring(t.能力类型,CHARINDEX('、',t.能力类型)+1,4000) ss 
from t where CHARINDEX('、',t.能力类型)>0
union all
select t.*
	,cte.lvl+1
	,substring(cte.ss,1,CHARINDEX('、',cte.ss)-1)s
	,substring(cte.ss,CHARINDEX('、',cte.ss)+1,4000)
from t join cte on t.姓名=cte.姓名 and cte.lvl<t.cnt 
)
select  
	cte.姓名
	,max(case lvl when 1 then 单独能力 else '' end) 能力1
	,max(case lvl when 2 then 单独能力 else '' end) 能力2
	,max(case lvl when 3 then 单独能力 else '' end) 能力3
	,max(case lvl when 4 then 单独能力 else '' end) 能力4
	,max(case lvl when 5 then 单独能力 else '' end) 能力5
	--..........
from cte
group by cte.姓名
最后一步查询还是只能假定字段数,并不自动。看来只要是不确定分割个数的,必须用动态SQL才能完美实现。
CF_HN_CN 2015-09-23
  • 打赏
  • 举报
回复
引用 楼主 chenfeng_cstp 的回复:
姓名 能力类型 张三 “计划/组织/协调能力、沟通能力、分析判断能力、培养他人能力” 李四 “沟通能力、协调能力、学习能力" 想根据上面的内容查询出 姓名 能力1 能力2 能力3 能力4 张三 计划/组织/协调能力 沟通能力 分析判断能力 培养他人能力 李四 沟通能力 协调能力 学习能力 效果跟Excel中的固定符号分列功能一样效果。
想是实现通过一个语句能够查询出

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧