一个字段内容有固定符号分列查询解决思路
一个字段内容有固定符号分列查询
姓名 能力类型
张三 “计划/组织/协调能力、沟通能力、分析判断能力、培养他人能力”
李四 “沟通能力、协调能力、学习能力"
想根据上面的内容查询出
姓名 能力1 能力2 能力3 能力4
张三 计划/组织/协调能力 沟通能力 分析判断能力 培养他人能力
李四 沟通能力 协调能力 学习能力
效果跟Excel中的固定符号分列功能一样效果。
------解决思路----------------------
最后一步查询还是只能假定字段数,并不自动。看来只要是不确定分割个数的,必须用动态SQL才能完美实现。
姓名 能力类型
张三 “计划/组织/协调能力、沟通能力、分析判断能力、培养他人能力”
李四 “沟通能力、协调能力、学习能力"
想根据上面的内容查询出
姓名 能力1 能力2 能力3 能力4
张三 计划/组织/协调能力 沟通能力 分析判断能力 培养他人能力
李四 沟通能力 协调能力 学习能力
效果跟Excel中的固定符号分列功能一样效果。
------解决思路----------------------
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才能完美实现。