2016-06-16 23 views
0

我能夠找到有關如何將逗號分隔的字符串分隔爲列的信息:How Do I Split a Delimited String in SQL Server Without Creating a Function? - 但它不能很好地解決我的問題。SQL:如何根據關鍵字將逗號分隔的字符串分隔爲多列?

我正在使用的數據是給定記錄的興趣/活動列表。例如,一項記錄可能會有「瑜伽,遠足」等等。目前我們共有63項不同的活動,但我們也需要適應尚不存在的活動。

我一直在負責是建立一個自動化的過程,其中:

  • 創建的表中列出的每個活動的新列(並創建新列被添加爲目前不存在活動)
  • 讓列反映活動的名稱
  • 如果記錄包含活動,則該活動的列中有一個Y.

最終結果將是這個樣子......

id | activities  | art | yoga | music | hiking | ... 
----------------------------------------------------------- 
1 | yoga, hiking  | NULL | y | NULL | y  | ... 
2 | art, music, yoga | y | y | y  | NULL | ... 

謝謝你提前,可以提供任何幫助,讓我知道是否需要任何更多的信息。

+0

顯示你迄今嘗試過,我們在這裏幫助解決你給了一些這方面的努力之後。 – JiggsJedi

+0

我已經嘗試過自己研究答案,並上傳了我所能找到的最接近的例子。我沒有寫出任何語法,因爲我真的不知道從哪裏開始。 –

回答

0

這裏有兩個概念可以學習。

首先,您必須將字符串拆分爲行。 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) 
+0

謝謝你,當我回到辦公室時,我會嘗試一下。 –