2011-04-14 70 views
3

這可能很容易,但我無法理解它。 SQL Server 2008中 我有以下幾點:將列轉移到表格

SELECT userId, accesslevel 
FROM accesscontrol.dbo.BADGELINK 

結果我得到的是

user id   accesslevel 
72     1 
72     5 
72     9 
89     1 
89     4 
91     9 
91     11 

我想什麼是

user id  acesslevels 
72    1,5,9 
89    1,4 
91    9,11 

任何想法任何人?

回答

3

在SQL Server中,你可以這樣做:

Select B.user_id 
    , Stuff(
     (
     Select ',' + B1.AccessLevel 
     From AccessControl.dbo.BadgeLink As B1 
     Where B1.user_id = B.user_id 
     Group By B1.AccessLevel 
     For Xml Path('') 
     ), 1, 2, '') As AccessLevels 
From AccessControl.dbo.BadgeLink As B 
Group By B.user_id 
+0

我經常使用這種方法,效果很好。可能想用/不用內部的GROUP BY來測試它是否需要。 – thomasswilliams 2011-04-14 22:35:39

2

有關於這一主題的這裏絕對精彩文章:http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/它生活在我的書籤,我經常提到它。如果這不能完全回答你的問題,請讓我知道

+0

使用遞歸CTE是一種聰明的方法。詳盡,但技術上符合ISO。 – Thomas 2011-04-14 22:08:15

+0

@Thomas,對我來說,OP似乎並不關心ISO合規性,而是想找到一種方法來實現他對SQL Server 2008的目標。 – 2011-04-14 22:17:53

+0

我們知道,因爲標籤已更新,所以知道。最初,這個問題的唯一標籤是'sql'。 – Thomas 2011-04-14 23:31:42