You are looking for dynamic T-SQL PIVOT. The idea is simple - build the PIVOT columns using DISTINCT over the [Strike] column values.
CREATE TABLE #DataSource
(
[TradeDateTime] VARCHAR(32)
,[Strike] INT
,[CallOI] INT
);
INSERT INTO #DataSource ([TradeDateTime], [Strike], [CallOI])
VALUES ('2023-08.02 15.01.00', 19500, 31015)
,('2023-08.02 15.01.00', 19550, 2606)
,('2023-08.02 15.01.00', 19600, 18062)
,('2023-08.02 15.01.00', 19650, 2553);
DECLARE @DynammicTSQLStatement NVARCHAR(MAX)
,@DynamicPIVOTColumns NVARCHAR(MAX);
SET @DynamicPIVOTColumns = STUFF
(
(
SELECT ',[' + CAST([Strike] AS VARCHAR(12)) + ']'
FROM #DataSource
GROUP BY [Strike]
ORDER BY [Strike]
FOR XML PATH('') ,TYPE
).value('.', 'NVARCHAR(MAX)')
,1
,1
,''
);
SET @DynammicTSQLStatement = N'
SELECT *
FROM #DataSource
PIVOT
(
MAX([CallOI]) FOR [Strike] IN (' + @DynamicPIVOTColumns + ')
) PVT';
EXEC sp_executesql @DynammicTSQLStatement;
DROP TABLE #DataSource;
