SQL SERVER 2012
DECLARE @TABLE TABLE
(
BASENAME varchar(150),
DESCRIPTIONS varchar(150)
)
insert @TABLE
SELECT 'Accessory', 'Color' UNION ALL
SELECT 'Accessory', 'Compatibility'UNION ALL
SELECT 'Accessory', 'Finish'UNION ALL
SELECT 'Accessory', 'Material'UNION ALL
SELECT 'Accessory', 'Mount Type'UNION ALL
SELECT 'Adapter', 'Adjustable'UNION ALL
SELECT 'Adapter', 'Ampere'UNION ALL
SELECT 'Adapter', 'Compatibility'UNION ALL
SELECT 'Adapter', 'MountType'UNION ALL
SELECT 'Adapter', 'Operation Type'UNION ALL
SELECT 'Adapter', 'Vertical Lift'UNION ALL
SELECT 'Adapter', 'Drawbar'UNION ALL
SELECT 'Adapter', 'Switch'
OUTPUT
BASENAME DESC1 DESC2 DESC3 DESC4 DESC5 DESC6 DESC7 DESC8
Accessory Color Compatibility Material Mount Type NULL NULL NULL NULL
Adapter Adjustable Ampere Compatibility MountType Operation Type Vertical Lift Drawbar Switch
The max number of DESC would be DESC 50 for one of the BASENAME. STUFF not work in this scenario, as it is creating error as
Error: The number of elements in the select list exceeds the maximum allowed number of 4096 elements.
Code i tried:
DECLARE @Cols NVARCHAR(MAX);
DECLARE @SQL NVARCHAR(MAX);
DECLARE @Sel NVARCHAR(MAX);
DECLARE @GENERIC NVARCHAR(MAX)
SET @Cols = STUFF((SELECT distinct ',' + QUOTENAME([Description])
FROM STAGING_TEMP
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
SET @Sel = STUFF((SELECT distinct ',' + QUOTENAME([Description]) +
' AS DESC'+CAST(row_number () over (partition by [Generic Name] order by [description]) as varchar(250))
FROM STAGING_TEMP
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
SET @SQL = N'
SELECT DISTINCT [Generic Name], '+ @Sel+N'
FROM STAGING_TEMP
pivot
(
MAX(Description) For Description IN ('+ @Cols + N')
) P';
EXECUTE( @SQL);
is there any other way to achieve the desired output.