我在这里发布了一个问题Show multiple records in a row得到这样的结果
它在MySQL中得到了很好的回答,但我正在使用查询不同的SQL Server。我的桌子是
CREATE TABLE events
(
id int NOT NULL,
event_name varchar(100) NOT NULL,
event_id int NOT NULL
);
INSERT INTO events (id, event_name, event_id)
VALUES (1, 'dance', 1), (2, 'sing', 2), (3, 'acting', 3), (4, 'debate', 4);
CREATE TABLE students
(
id int NOT NULL,
student_name text NOT NULL,
event_id int NOT NULL
);
INSERT INTO students (id, student_name, event_id)
VALUES (1, 'student1', 1), (2, 'student1', 2),
(3, 'student1', 3), (4, 'student1', 4),
(5, 'student2', 3), (6, 'student3', 2),
(7, 'student3', 4);
我在这里尝试使用http://rextester.com/RXK72524的示例查询,但它不能正常工作。
我用过的查询
SELECT
s.student_name,
STUFF (g.student_name, 1, 1, '') AS events
FROM
Students s
CROSS APPLY
(SELECT
',' + e.event_name
FROM
students s
LEFT JOIN
events e ON s.event_id = e.event_id
ORDER BY
e.event_name
FOR XML PATH ('')) g (student_name)
请指正。谢谢
http://rextester.com/LOQZE28952
PS:如果你将student_name列改为
NVACHAR
而不是TEXT
,你的生活会更容易,它将节省您不使用强制转换功能
--Sql Server 2014 Express Edition
--Batches are separated by 'go'
select @@version as 'sql server version'
CREATE TABLE events (
id int NOT NULL,
event_name varchar(100) NOT NULL,
event_id int NOT NULL
);
INSERT INTO events (id, event_name, event_id)
VALUES
(1, 'dance', 1),
(2, 'sing', 2),
(3, 'acting', 3),
(4, 'debate', 4);
CREATE TABLE students (
id int NOT NULL,
student_name text NOT NULL,
event_id int NOT NULL
);
INSERT INTO students (id, student_name, event_id)
VALUES
(1, 'student1', 1),
(2, 'student1', 2),
(3, 'student1', 3),
(4, 'student1', 4),
(5, 'student2', 3),
(6, 'student3', 2),
(7, 'student3', 4);
SELECT DISTINCT(cast(s.student_name as NVARCHAR(100))) as Students,
stuff (g.student_name, 1, 1, '') as events
FROM Students s
CROSS APPLY
(
SELECT ',' + e.event_name
FROM Students s1
left join events e on s1.event_id = e.event_id
where cast(s1.student_name as NVARCHAR(100)) = cast(s.student_name as NVARCHAR(100))
ORDER BY e.event_name
FOR XML PATH ('')
) g (student_name)