The real problem here is that you have an indeterminable number of rows. This means you need dynamic SQL, The next problem is that you don't have unique values to pivot on, so we need to get inventive with ROW_NUMBER as well. This gives this, which is not particularly pretty, but "works".
CREATE TABLE dbo.YourTable (Item char(3),
ID int);
INSERT INTO dbo.YourTable (Item,
ID)
VALUES('1-A',213),
('2-B',432),
('3-C',267),
('3-C',879),
('3-C',467);
GO
DECLARE @SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
DECLARE @Delimiter nvarchar(30) = N',' + @CRLF + N' ';
WITH RNs AS(
SELECT Item,
ID,
ROW_NUMBER() OVER (ORDER BY Item) AS RN
FROM dbo.YourTable)
SELECT @SQL = N'WITH RNs AS(' + @CRLF +
N' SELECT Item,' + @CRLF +
N' ID,' + @CRLF +
N' ROW_NUMBER() OVER (ORDER BY Item) AS RN' + @CRLF +
N' FROM dbo.YourTable)' + @CRLF +
N'SELECT ' +
STRING_AGG(CONCAT(N'MAX(CASE WHEN Item = ',QUOTENAME(R.Item,''''),N' AND RN = ',R.RN,N' THEN R.ID END) AS ',QUOTENAME(R.Item)),@Delimiter) WITHIN GROUP (ORDER BY R.Item, R.RN) + @CRLF +
N'FROM RNs R;'
FROM RNs R;
PRINT @SQL;
EXEC sys.sp_executesql @SQL;
GO
DROP TABLE dbo.YourTable;
I have assumed you are using a recent version of SQL Server. If not, you will need to replace STRING_AGG with the older FOR XML PATH method.
DB<>Fiddle
Item(as it is clearly notID) or does the order not matter?