首页 >数据库 >mysql教程 >如何在 SQL Server 中转置具有多列的表?

如何在 SQL Server 中转置具有多列的表?

Barbara Streisand
Barbara Streisand原创
2025-01-14 21:11:50597浏览

How to Transpose a Table with Multiple Columns in SQL Server?

SQL Server多列表数据透视方法

在多种情况下,将表转换为其转置形式都非常有用。本文重点介绍如何在Microsoft SQL Server中转置具有多个列(A、B等)的表。

使用UNPIVOT和PIVOT进行数据透视

要转置表,您可以结合使用UNPIVOT和PIVOT函数:

  • UNPIVOT: 将多列转换为行,创建一个名为col的新列,其中包含列名(A、B等),以及一个包含对应值的value列。
  • PIVOT: 将col值转换为列标题,并为每个标题汇总value列。

示例如下:

<code class="language-sql">select *
from
(
  select day, col, value
  from yourtable
  unpivot
  (
    value
    for col in (A, B)
  ) unpiv
) src
pivot
(
  max(value)
  for day in (Mon, Tue, Wed, Thu, Fri)
) piv;</code>

针对SQL Server 2008及以上版本的CROSS APPLY和VALUES方法

对于SQL Server 2008及以上版本,您还可以使用CROSS APPLY与VALUES组合来解开数据:

<code class="language-sql">select *
from
(
  select day, col, value
  from yourtable
  cross apply
  (
    values ('A', ACalls),('B', BCalls)
  ) c (col, value)
) src
pivot
(
  max(value)
  for day in (Mon, Tue, Wed, Thu, Fri)
) piv;</code>

应用于您的查询

如果您想转置当前查询的结果,可以使用类似的方法:

<code class="language-sql">select *
from
(
  select LEFT(datename(dw,datetime),3) as DateWeek,
    col, 
    value
  from DataTable 
  cross apply 
  (
    values ('A', ACalls), ('B', BCalls)
  ) c (col, value)
) src
pivot
(
  sum(value)
  for dateweek in (Mon, Tue, Wed, Thu, Fri)
) piv;</code>

这会将ACalls和BCalls列转置为行,并为每周的每一天(Mon、Tue等)创建列标题。

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

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