首頁 > 資料庫 > mysql教程 > 如何在 SQL Server (T-SQL) 中將列轉換為行?

如何在 SQL Server (T-SQL) 中將列轉換為行?

Linda Hamilton
發布: 2025-01-21 19:22:10
原創
498 人瀏覽過

How to Convert Columns to Rows in SQL Server (T-SQL)?

SQL Server 中將列轉換為行的幾種方法

本文介紹如何將 SQL Server 表中的列資料轉換為行資料。假設你的表格結構如下:

<code class="language-sql">[ID] [EntityID] [Indicator1] [Indicator2] [Indicator3] ... [Indicator150]</code>
登入後複製

目標是將資料轉換為以下結構:

<code class="language-sql">[ID] [EntityId] [IndicatorName] [IndicatorValue]</code>
登入後複製

目標結果範例:

<code>1 1 'Indicator1' 'Indicator 1 的值'
2 1 'Indicator2' 'Indicator 2 的值'
3 1 'Indicator3' 'Indicator 3 的值'
4 2 'Indicator1' 'Indicator 1 的值'</code>
登入後複製

解:

以下幾種方法可以實現列到行的轉換:

1. 使用 UNPIVOT 函數

UNPIVOT 函數可以有效地將列轉換為行:

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

請確保參與轉換的欄位的資料類型一致。

2. 使用 CROSS APPLY 和 UNION ALL

另一種方法是使用 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>
登入後複製

3. 使用 CROSS APPLY 和 VALUES (適用於較新版本的 SQL Server)

在較新的 SQL Server 版本中,可以使用 CROSS APPLY 和 VALUES 子句:

<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>
登入後複製

4. 使用動態 SQL (適用於大量 Indicator 欄位)

對於包含大量 Indicator 欄位的大型資料表,可以使用動態 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(''), TYPE).value('.', 'NVARCHAR(MAX)'), 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 版本。 對於較少的列,前三種方法足夠;而對於包含大量 Indicator 列的表,動態 SQL 方法更有效率。 記得將 yourtable 替換成你的實際表名。

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

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