Another way is to use
ROW_NUMBER()[
^] function:
Test it:
CREATE TABLE #test (mtm_id INT, package_id INT, attribute_id INT, value VARCHAR(30))
INSERT INTO #test (mtm_id, package_id, attribute_id, value)
VALUES(10708, 148323, 23, 'a'),
(10708, 148323, 35, '12'),
(10708, 148323, 39, '20'),
(10708, 148323, 46, '12'),
(10708, 148323, 50, '1')
SELECT mtm_id, package_id, [1], [2], [3], [4], [5], [6], [7]
FROM (
SELECT ROW_NUMBER() OVER(PARTITION BY mtm_id ORDER BY attribute_id) AS RowNo, mtm_id, package_id, [value]
FROM #test
) AS DT
PIVOT (MAX([value]) FOR RowNo IN([1],[2],[3],[4],[5],[6],[7])) AS PT
DROP TABLE #test
Note: in above example number of columns were added manually. It would be created 'on the fly' by using
STUFF[
^] function ;)
Example:
pivot multiple columns into rows in sql server[
^]
Result:
mtm_id p.._id [1] [2] [3] [4] [5] [6] [7]
10708 148323 a 12 20 12 1 NULL NULL
[EDIT]
dynamic version ;)
CREATE TABLE #test (mtm_id INT, package_id INT, attribute_id INT, value VARCHAR(30))
INSERT INTO #test (mtm_id, package_id, attribute_id, value)
VALUES(10708, 148323, 23, 'a'),
(10708, 148323, 35, '12'),
(10708, 148323, 39, '20'),
(10708, 148323, 46, '12'),
(10708, 148323, 50, '1'),
(10709, 148323, 39, 'b'),
(10710, 148323, 46, 'c'),
(10710, 148323, 46, '1'),
(10710, 148323, 46, '3'),
(10710, 148323, 46, '5'),
(10710, 148323, 46, '7'),
(10710, 148323, 46, '9'),
(10710, 148323, 46, '11')
DECLARE @cols VARCHAR(300) = ''
DECLARE @dt VARCHAR(2000) = ''
DECLARE @pt VARCHAR(MAX) = ''
SET @cols = STUFF((SELECT DISTINCT '],[' + CONVERT(VARCHAR(10), C.RowNo)
FROM (
SELECT ROW_NUMBER() OVER(PARTITION BY mtm_id ORDER BY attribute_id) AS RowNo, mtm_id, package_id, [value]
FROM #test
) C
FOR XML PATH('')),1,2,'') + ']'
SET @dt = 'SELECT ROW_NUMBER() OVER(PARTITION BY mtm_id ORDER BY attribute_id) AS RowNo, mtm_id, package_id, [value] ' +
'FROM #test'
SET @pt = 'SELECT mtm_id, package_id, ' + @cols +
' FROM (' + @dt + ') AS DT ' +
' PIVOT (MAX([value]) FOR RowNo IN(' + @cols + ')) AS PT '
EXEC(@pt)
DROP TABLE #test
[/EDIT]