How to: merge rows into single row?
Example:
IF NOT OBJECT_ID(N'#BooksGenre') IS NULL
DROP TABLE #BooksGenre
CREATE TABLE #BooksGenre (
BookId INT NOT NULL,
AuthorID INT NOT NULL,
Genre NVARCHAR (50))
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (1, 1, 'comedy')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (1, 1, 'fantasy')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (1, 1, 'short story')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (2, 1, 'traveling')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (2, 1, 'guide')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (303, 55, 'science fiction')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (303, 55, 'horror')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (1015, 99, 'tragedy')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (1015, 99, 'novel')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (1015, 99, 'drama')
DECLARE @cols NVARCHAR(200)
DECLARE @subqry NVARCHAR(400)
DECLARE @pivqry NVARCHAR(1000)
SET @cols = STUFF((SELECT DISTINCT '],[' + [Genre]
FROM [#BooksGenre]
ORDER BY '],[' + [Genre]
FOR XML PATH('')),1,2,'') + ']'
SET @subqry = N'SELECT [AuthorId],[BookId],[Genre] ' +
'FROM [#BooksGenre]'
SET @pivqry= N'SELECT PT.[AuthorId], [BookId], ' + @cols + ' ' +
'FROM (' + @subqry + ') AS DT ' +
'PIVOT (COUNT(DT.[Genre]) FOR DT.[Genre] IN (' + @cols + ')) AS PT ' +
'ORDER BY PT.[AuthorId], [BookId]'
EXEC (@pivqry)
SELECT t1.[AuthorId], t1.[BookId], STUFF( (SELECT ', ' + [Genre] AS 'text()'
FROM #BooksGenre AS t2
WHERE t2.BookId = t1.BookId
FOR XML PATH('')), 1, 1, '') AS [Keywords]
FROM #BooksGenre AS t1
GROUP BY t1.[AuthorId], t1.[BookId]
DROP TABLE #BooksGenre