SQL Server行转列求助:将Strike行值转为列的SQL查询方案
SQL Server 行列转换实现方案
针对你需要将TradeDateTime作为行、Strike值作为列、CallOI作为对应值的行列转换需求,提供两种实现方式:
1. 静态列实现(已知Strike固定值)
如果你的Strike值是固定的(如示例中的19500、19550、19600、19650),可以直接使用PIVOT函数完成转换:
SELECT TradeDateTime, [19500], [19550], [19600], [19650] FROM (SELECT TradeDateTime, Strike, CallOI FROM YourTableName) AS SourceTable PIVOT ( SUM(CallOI) -- 因同一TradeDateTime+Strike唯一,SUM/MAX/MIN结果一致 FOR Strike IN ([19500], [19550], [19600], [19650]) ) AS PivotTable;
注意:将YourTableName替换为你的实际数据表名称。
2. 动态列实现(Strike值不固定)
如果Strike的值可能新增或变化,需要动态生成列名,避免每次修改SQL语句:
适用于SQL Server 2017及以上版本
DECLARE @Columns NVARCHAR(MAX), @SQL NVARCHAR(MAX); -- 动态获取所有Strike值作为列名 SELECT @Columns = STRING_AGG(QUOTENAME(Strike), ', ') FROM (SELECT DISTINCT Strike FROM YourTableName) AS DistinctStrikes; -- 构建并执行动态PIVOT语句 SET @SQL = N' SELECT TradeDateTime, ' + @Columns + N' FROM (SELECT TradeDateTime, Strike, CallOI FROM YourTableName) AS SourceTable PIVOT ( SUM(CallOI) FOR Strike IN (' + @Columns + N') ) AS PivotTable;'; EXEC sp_executesql @SQL;
适用于SQL Server 2016及以下版本
DECLARE @Columns NVARCHAR(MAX), @SQL NVARCHAR(MAX); -- 用FOR XML PATH拼接列名 SELECT @Columns = STUFF((SELECT ', ' + QUOTENAME(Strike) FROM (SELECT DISTINCT Strike FROM YourTableName) AS DistinctStrikes FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, ''); -- 构建并执行动态PIVOT语句 SET @SQL = N' SELECT TradeDateTime, ' + @Columns + N' FROM (SELECT TradeDateTime, Strike, CallOI FROM YourTableName) AS SourceTable PIVOT ( SUM(CallOI) FOR Strike IN (' + @Columns + N') ) AS PivotTable;'; EXEC sp_executesql @SQL;
替换YourTableName为实际表名即可。
内容的提问来源于stack exchange,提问作者Chelladurai
相关产品推荐
相关产品推荐

