2013-01-03 21 views
1

可能重复:
Simulating group_concat MySQL function in Microsoft SQL Server 2005?如何把多项行成一排由SQL Server

我有2台这样的

Class表:
enter image description here

And 学生表:
enter image description here

我想连接两个表,但是我想有结果这样
ClsName StdName
一个             乔治
乙              Jenifer,Anjel,Alex
C              亚历克斯,乔,迈克尔


如何能达到这样做呢?
其实每一类我想有一排用不同的学生姓名

+0

http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-microsoft-sql-server-2005 –

回答

4

您应该能够使用以下命令:

select c.name ClassName, 
    STUFF((SELECT distinct ', ' + s.name 
      FROM student s 
      WHERE c.id = s.classid 
      FOR XML PATH('') 
      ), 1, 2, '') Names 
from class c 

结果:

ClassName | Names 
A   | George 
B   | Alex, Anjel, Jenifer 
C   | Alex, Joe, Micheal 

这里是我使用的工作查询:

;with class(id, name) as 
(
    select 1, 'A' 
    union all 
    select 2, 'B' 
    union all 
    select 3, 'C' 
), 
student(id, name, classid) as 
(
    select 1, 'Alex', 3 
    union all 
    select 2, 'Alex', 3 
    union all 
    select 3, 'Alex', 3 
    union all 
    select 4, 'Joe', 3 
    union all 
    select 5, 'Micheal', 3 
    union all 
    select 6, 'Jenifer', 2 
    union all 
    select 7, 'Anjel', 2 
    union all 
    select 8, 'Alex', 2 
    union all 
    select 9, 'George', 1 
) 
select c.name, 
    STUFF((SELECT distinct ', ' + s.name 
      FROM student s 
      WHERE c.id = s.classid 
      FOR XML PATH('') 
      ), 1, 2, '') Names 
from class c 
+0

+1以下是证据;)http://www.sqlfiddle.com/#!6/dcbb2/6/0 –

+0

@TimSchmelter非常感谢。我忘了SQL小提琴了2012年,2008年没有工作。 – Taryn

1

你可以试试这个:

SELECT 
    distinct 
    S.Classid, 
    (
     SELECT name + ',' 
     FROM Student S2 
     WHERE S2.Classid = S.Classid 
     FOR XML PATH('') 
    ) StdName, 
    C.name ClsName 
FROM 
Student S INNER JOIN Class C 
ON S.Classid = C.id 
+0

您可能想要使它成为'','+ name',然后['STUFF'](http://msdn.microsoft.com/zh-cn/library/ms188043.aspx)以删除第一个字符,以便它不会用逗号结尾。 – Lucero