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

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

Barbara Streisand
Barbara Streisand原創
2025-01-21 19:32:091107瀏覽

How to Efficiently Convert Columns to Rows in SQL Server?

SQL Server:列轉行

在SQL Server中,您可能需要將包含多個指示符列的表轉換為每個指示符及其對應值的行的結構。這可以透過幾種技術來實現。

UNPIVOT函數

UNPIVOT函數是將列轉換為行的直接方法。它將指定的列轉換為行,原始列名成為標記為“indicatorname”的新行。原始列的值成為標記為“indicatorvalue”的行。

<code class="language-sql">SELECT id, entityId,
  indicatorname,
  indicatorvalue
FROM yourtable
UNPIVOT
(
  indicatorvalue
  FOR indicatorname IN (Indicator1, Indicator2, Indicator3)
) unpiv;</code>

使用UNION ALL的CROSS APPLY

另一種方法是將CROSS APPLY與UNION ALL結合使用:

<code class="language-sql">SELECT id, entityid,
  indicatorname,
  indicatorvalue
FROM yourtable
CROSS APPLY
(
  SELECT 'Indicator1', Indicator1 UNION ALL
  SELECT 'Indicator2', Indicator2 UNION ALL
  SELECT 'Indicator3', Indicator3 UNION ALL
  SELECT 'Indicator4', Indicator4 
) c (indicatorname, indicatorvalue);</code>

使用VALUES子句的CROSS APPLY

如果您的SQL Server版本支持,您也可以利用VALUES子句與CROSS APPLY:

<code class="language-sql">SELECT id, entityid,
  indicatorname,
  indicatorvalue
FROM yourtable
CROSS APPLY
(
  VALUES
  ('Indicator1', Indicator1),
  ('Indicator2', Indicator2),
  ('Indicator3', Indicator3),
  ('Indicator4', Indicator4)
) c (indicatorname, indicatorvalue);</code>

動態SQL

對於具有許多指示符列的表,手動產生必要的SQL語句可能會很繁瑣。動態SQL可以自動化此流程:

<code class="language-sql">DECLARE @colsUnpivot AS NVARCHAR(MAX),
   @query  AS NVARCHAR(MAX)

SELECT @colsUnpivot 
  = STUFF((SELECT ',' + QUOTENAME(C.column_name)
           FROM INFORMATION_SCHEMA.COLUMNS AS C
           WHERE C.table_name = 'yourtable' AND
                 C.column_name LIKE 'Indicator%'
           FOR XML PATH('')), 1, 1, '')

SET @query 
  = 'SELECT id, entityId,
        indicatorname,
        indicatorvalue
     FROM yourtable
     UNPIVOT
     (
        indicatorvalue
        FOR indicatorname IN (' + @colsunpivot +')
     ) u'

EXEC sp_executesql @query;</code>

這些技術提供了在SQL Server中將列轉換為行的靈活方法,可以適應不同的表結構和資料需求。

以上是如何在SQL Server中有效率地將列轉換為行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn