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

如何在 SQL 中转置多列表?

Patricia Arquette
Patricia Arquette原创
2025-01-14 21:01:43556浏览

How Can I Transpose a Multi-Column Table in SQL?

SQL Server 多列表转置

表转置是指将行转换为列,列转换为行。当您需要透视数据以进行分析或演示时,这尤其有用。

问题:

您想转置一个包含多列的表,将其从以下格式:

Day A B
Mon 1 2
Tue 3 4
Wed 5 6
Thu 7 8
Fri 9 0

转换为以下格式:

Value Mon Tue Wed Thu Fri
A 1 3 5 7 9
B 2 4 6 8 0

解决方案:

要在 SQL 中转置多列表,您可以结合使用 UNPIVOT 和 PIVOT 函数。

1. UNPIVOT:

UNPIVOT 函数通过将列转换为行来反规范化数据。这将创建一个包含三列的新表:day、col 和 value。

<code class="language-sql">select day, col, value
from yourtable
unpivot
(
    value
    for col in (A, B)
) unpiv</code>

2. PIVOT:

然后,PIVOT 函数通过将 day 值转换为列来重新规范化数据。这将生成转置后的表。

<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>

注意:

  • PIVOT 查询中使用了 MAX 聚合函数,以确保正确处理重复值。
  • 对于 SQL Server 2008 及更高版本,您可以使用带 VALUES 语法的 CROSS APPLY 来反转数据,而不是 UNPIVOT。

应用于您的查询:

要转置您的特定查询,您可以使用以下修改后的代码:

<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>

这将生成所需格式的转置表。

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

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