首页 >数据库 >mysql教程 >如何在 SQL Server (T-SQL) 中将列转换为行?

如何在 SQL Server (T-SQL) 中将列转换为行?

Linda Hamilton
Linda Hamilton原创
2025-01-21 19:22:10542浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn