If the number of items are static then use:-SELECT t.Pallet, MAX(CASE WHEN t.RowNo=1 THEN t.Item ELSE NULL END) AS Item1, MAX(CASE WHEN t.RowNo=2 THEN t.Item ELSE NULL END) AS Item2, MAX(CASE WHEN t.RowNo=3 THEN t.Item ELSE NULL END) AS Item3, MAX(CASE WHEN t.RowNo=4 THEN t.Item ELSE NULL END) AS Item4, MAX(CASE WHEN t.RowNo=5 THEN t.Item ELSE NULL END) AS Item5FROM(SELECT ROW_NUMBER() OVER(PARTITION BY Pallet ORDER BY Item) AS RowNo,Pallet,ItemFROM Table)tGROUP BY t.Pallet
If item number is not static use d-sql with pivot:-CREATE table #table(Pallet varchar(20),Item varchar(20))INSERT INTo #tableSELECT 'Pallet1','ItemA1'UNION ALLSELECT 'Pallet1', 'ItemB1'UNION ALLSELECT 'Pallet1', 'ItemC1'UNION ALLSELECT 'Pallet1', 'ItemD1'UNION ALLSELECT 'Pallet1', 'ItemE1'UNION ALLSELECT 'Pallet2', 'ItemA2'UNION ALLSELECT 'Pallet2', 'ItemB2'UNION ALLSELECT 'Pallet2', 'ItemC2'UNION ALLSELECT 'Pallet2', 'ItemD2'DECLARE @IDlist varchar(1000),@Sql varchar(max)SELECT @IDlist =REPLACE(LEFT(il.idlist,LEN(il.idlist)-1),',','],[')FROM(SELECT DISTINCT CAST(t.RowNo AS varchar(4)) + ','from(SELECT ROW_NUMBER() OVER(PARTITION BY Pallet ORDER BY Item) AS RowNo,Pallet,ItemFROM #table)tFOR XML PATH(''))il(idlist)SET @Sql='SELECT * FROM(SELECT ROW_NUMBER() OVER(PARTITION BY Pallet ORDER BY Item) AS RowNo,Pallet,ItemFROM #table)mPIVOT (MAX(Item) FOR RowNo IN ([' + @IDlist + ']))p'EXEC (@Sql)EDIT:missed braces