Я написал следующий запрос для построения базового набора данных, используя общее табличное выражение, а затем операцию группировки / объединения, чтобы получить результаты, которые, я думаю, вы ищете:
WITH temp AS (
SELECT CAST('1/1/2009' AS DATETIME) AS Date, 'Training 1' AS Session, 'Mike' AS Participant
UNION ALL
SELECT CAST('1/1/2009' AS DATETIME) AS Date, 'Training 1' AS Session, 'Bill' AS Participant
UNION ALL
SELECT CAST('1/1/2009' AS DATETIME) AS Date, 'Training 1' AS Session, 'Steve' AS Participant
UNION ALL
SELECT CAST('1/2/2009' AS DATETIME) AS Date, 'Training 2' AS Session, 'Steve' AS Participant
UNION ALL
SELECT CAST('1/2/2009' AS DATETIME) AS Date, 'Training 2' AS Session, 'Bill' AS Participant
UNION ALL
SELECT CAST('1/3/2009' AS DATETIME) AS Date, 'Training 3' AS Session, 'Mike' AS Participant
)
SELECT DISTINCT
Date,
Session,
(
SELECT STUFF(
(
SELECT
',' + CAST(Participant AS NVARCHAR(50)) + '' AS [text()]
FROM
temp b
WHERE
b.Date = a.Date AND
b.Session = a.Session
FOR
XML PATH('')
),
1,
1,
''
)
) AS Participants
FROM
temp a
Это выводит следующее:
Date Session Participants
2009-01-01 00:00:00.000 Training 1 Mike,Bill,Steve
2009-01-02 00:00:00.000 Training 2 Steve,Bill
2009-01-03 00:00:00.000 Training 3 Mike
Вы можете отформатировать эти результаты по своему усмотрению в SSRS. Нет никаких обещаний, что это будет работать быстро на очень большом наборе данных из-за предложения DISTINCT, но любая операция группировки, выполняемая с большим набором данных, в любом случае будет медленной. Использование такого предложения FOR XML абсолютно справедливо, когда речь идет о конкатенации.
Надеюсь, это поможет.