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

如何在 SQL Server 中将列转换为行?

Patricia Arquette
发布: 2025-01-21 19:27:14
原创
583 人浏览过

How Can I Convert Columns to Rows in SQL Server?

SQL Server 中的列转行转换

将数据库列转换为行是数据分析和重组中的重要技术。在 SQL Server 中,可以通过多种方法实现这种转换,每种方法都有其自身的优点和注意事项。

方法一:UNPIVOT 函数

UNPIVOT 函数原生支持列转行转换。UNPIVOT 的语法如下:

UNPIVOT (indicatorvalue FOR indicatorname IN (Indicator1, Indicator2, Indicator3, ...)) AS unpiv
登录后复制

示例:

SELECT id, entityId,
  indicatorname,
  indicatorvalue
FROM yourtable
UNPIVOT
(
  indicatorvalue
  FOR indicatorname IN (Indicator1, Indicator2, Indicator3)
) unpiv;
登录后复制

方法二:使用 UNION ALL 的 CROSS APPLY

使用 UNION ALL 的 CROSS APPLY 是另一种将列转换为行的方法。它基于提供的列迭代地组合行:

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);
登录后复制

方法三:使用 VALUES 的 CROSS APPLY

此方法利用 CROSS APPLY 中的 VALUES 子句来指定列名和值:

SELECT id, entityid,
  indicatorname,
  indicatorvalue
FROM yourtable
CROSS APPLY
(
  VALUES
  ('Indicator1', Indicator1),
  ('Indicator2', Indicator2),
  ('Indicator3', Indicator3),
  ('Indicator4', Indicator4)
) c (indicatorname, indicatorvalue);
登录后复制

方法四:动态 SQL

对于需要解旋大量列的场景,动态 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;
登录后复制

通过为您的特定场景选择最合适的方法,您可以高效地在 SQL Server 中执行列转行转换。

以上是如何在 SQL Server 中将列转换为行?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板