Я видел решения, использующие пользовательские функции в SQL 2000, но они пугают - они в основном делают совершенно новые SELECT
для каждой группы, которая может выполняться сотни или тысячи раз. На самом деле вам лучше использовать курсор:
DECLARE @Temp TABLE
(
Company int NOT NULL PRIMARY KEY,
Employees varchar(4000) NOT NULL
)
DECLARE
@LastCompany int,
@Company int,
@Employee varchar(100),
@Employees varchar(4000)
DECLARE crEmployee CURSOR FAST_FORWARD FOR
SELECT Company, Employee
FROM @Tbl
ORDER BY Company
OPEN crEmployee
FETCH NEXT FROM crEmployee INTO @Company, @Employee
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (@LastCompany IS NULL)
SET @Employees = @Employee
ELSE IF (@Company = @LastCompany)
SET @Employees = @Employees + ',' + @Employee
ELSE BEGIN
INSERT @Temp (Company, Employees)
VALUES (@LastCompany, @Employees)
SET @Employees = @Employee
END
SET @LastCompany = @Company
FETCH NEXT FROM crEmployee INTO @Company, @Employee
END
CLOSE crEmployee
DEALLOCATE crEmployee
IF (@Employees IS NOT NULL)
INSERT @Temp (Company, Employees)
VALUES (@LastCompany, @Employees)
SELECT * FROM @Temp
Существует решение, использующее временную таблицу и UPDATE
, аналогичное той, которая использовалась для вычисления промежуточных итогов, но на это смотреть чудовищно, и в большинстве случаев производительность будет не намного лучше, чем у курсора.
Если кто-то действительно отчаянно хочет увидеть версию UPDATE
, я опубликую ее, но сначала советую попробовать версию курсора и посмотреть, достаточно ли она хороша.