在 SQL Server 中将行转换为列是处理以表格格式存储的数据时的一项常见任务。传统上,这是使用游标来实现的,这可能既耗时又低效。本文探讨了行转置的替代方法,提供了既优雅又高性能的解决方案。
一种方法是使用条件聚合,它利用 COALESCE() 函数来处理缺失值。
SELECT TimeSeconds, COALESCE(MAX(CASE WHEN TagID = 'A1' THEN Value END), 'n/a') A1, COALESCE(MAX(CASE WHEN TagID = 'A2' THEN Value END), 'n/a') A2, COALESCE(MAX(CASE WHEN TagID = 'A3' THEN Value END), 'n/a') A3, COALESCE(MAX(CASE WHEN TagID = 'A4' THEN Value END), 'n/a') A4 FROM table1 GROUP BY TimeSeconds
此查询生成带有占位符值('n/a')的输出,用于查找缺失的值数据。
另一个选项是使用 PIVOT 函数,它允许动态创建列。
SELECT TimeSeconds, A1, A2, A3, A4 FROM ( SELECT TimeSeconds, TagID, Value FROM table1 ) s PIVOT ( MAX(Value) FOR TagID IN (A1, A2, A3, A4) ) p
此方法会为丢失的数据生成带有 NULL 值的输出.
如果列数不固定,必须确定动态地,可以使用动态 SQL。
DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX) SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(TagID) FROM Table1 ORDER BY 1 FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'),1,1,'') SET @sql = 'SELECT TimeSeconds, ' + @cols + ' FROM ( SELECT TimeSeconds, TagID, Value FROM table1 ) s PIVOT ( MAX(Value) FOR TagID IN (' + @cols + ') ) p' EXECUTE(@sql)
此查询根据表中唯一的 TagID 值构造动态 PIVOT 语句。
这些方法为转置行提供高效且可定制的解决方案到 SQL Server 中的列。通过根据数据特征和性能需求选择合适的方法,您可以简化数据操作任务并提高查询执行效率。
以上是如何在 SQL Server 中高效地将行转置为列?的详细内容。更多信息请关注PHP中文网其他相关文章!