The quirky update method:
DECLARE @DistinctName TABLE
(
Name VARCHAR(10) PRIMARY KEY
);
INSERT @DistinctName (Name)
VALUES ('A'),('B');
DECLARE @Test TABLE
(
TestId INT IDENTITY(1,1) PRIMARY KEY
,Name VARCHAR(10) NOT NULL
,Score INT NOT NULL
,Result VARCHAR(1000) NOT NULL DEFAULT ''
);
INSERT @Test (Name, Score)
VALUES ('A',10),('A',20),('A',30),('B',40),('B',50);
DECLARE @OldName VARCHAR(10) = ''
,@IsNewGroup BIT = 1
,@Concat VARCHAR(1000);
WITH SourceCTE
AS
(
SELECT TOP(1000) t.*
FROM @Test t
ORDER BY t.Name
)
UPDATE SourceCTE
SET @IsNewGroup = CASE WHEN @OldName <> Name THEN 1 ELSE 0 END
,@OldName = Name
,@Concat = Result = CASE WHEN @IsNewGroup = 1 THEN '' ELSE @Concat END + ',' + CAST(Score AS VARCHAR(10))
--OUTPUT inserted.Name, inserted.TestId , inserted.Result
SELECT dn.Name
,SUBSTRING(ca.Result,2,1000) Result
FROM @DistinctName dn
CROSS APPLY
(
SELECT TOP(1) Result
FROM @Test t
WHERE t.Name = dn.Name
ORDER BY t.TestId DESC
) ca;
Mentions:
- I have added a primary key (TestId) in @Test table.
- Please read carefully this article about generating running totals using quirky update method to understand this method.