在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中文網其他相關文章!