首頁 > 資料庫 > mysql教程 > 如何在 SQL Server 中有效率地將行轉置為列?

如何在 SQL Server 中有效率地將行轉置為列?

Barbara Streisand
發布: 2025-01-05 00:25:42
原創
158 人瀏覽過

How Can I Efficiently Transpose Rows to Columns in SQL Server?

在SQL Server 中將行轉換為列

在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

另一個選項是使用 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

如果列數不固定,必須確定動態地,可以使用動態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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板