這裏有兩個概念可以學習。
首先,您必須將字符串拆分爲行。 xquery
是大型記錄集上最快的方法,儘管寫起來更加困難。
然後,您需要使用動態數據透視表將活動置於新列中。
我在下面提供了兩個輸出,只需選擇您最需要的套件。
Xquery Example
Dynamic Pivot Example
代碼示例:
if OBJECT_ID('tempdb..#tmp') is not null drop table #tmp
if OBJECT_ID('tempdb..#tmpsplit') is not null drop table #tmpsplit
declare @cols nvarchar(MAX), @sql nvarchar(MAX)
create table #tmp (id int identity(1,1), activities varchar(255))
insert into #tmp (activities)
values ('yoga, hiking'),
('art, music, yoga')
/* split activities into individual rows and store in #tmpsplit*/
SELECT DISTINCT A.ID,
ltrim(rtrim(Split.a.value('.', 'VARCHAR(max)'))) AS activity
into #tmpsplit
FROM (SELECT id,
CAST ('<M>' + REPLACE(CAST(activities AS VARCHAR), ',', '</M><M>') + '</M>' AS XML) AS String
FROM #tmp) AS A
CROSS APPLY String.nodes ('/M') AS Split(a)
WHERE LEN(Split.a.value('.', 'VARCHAR(max)'))>1
/* create list of activities to pivot */
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.activity)
FROM #tmpsplit c
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')
/* create pivot: id and columns only*/
set @sql = 'select id, ' + @cols + '
from (select s.*, ''y'' as val
from #tmpsplit s) datatable
pivot (max(val) for activity in (' + @cols + ')
) p '
print(@sql)
exec(@sql)
/* create pivot: id, full activitites string, and columns*/
set @sql = 'select id, activities, ' + @cols + '
from (select s.*, t.activities, ''y'' as val
from #tmpsplit s
join #tmp t on s.id=t.id) datatable
pivot (max(val) for activity in (' + @cols + ')
) p '
print(@sql)
exec(@sql)
顯示你迄今嘗試過,我們在這裏幫助解決你給了一些這方面的努力之後。 – JiggsJedi
我已經嘗試過自己研究答案,並上傳了我所能找到的最接近的例子。我沒有寫出任何語法,因爲我真的不知道從哪裏開始。 –