转置列或反透视 SQL 查询

Posted

技术标签:

【中文标题】转置列或反透视 SQL 查询【英文标题】:Transpose Columns or unpivot SQL Query 【发布时间】:2014-05-09 09:36:27 【问题描述】:

我目前正在尝试在 SQL 查询中转置一些数据,但是我似乎找不到使用 un-pivot 的解决方案。我正在使用的数据示例是

SELECT  * FROM (SELECT 'ACCOUNTS' AS Dept
          , DATENAME(MONTH, GETDATE()) AS [Month]
          , '3254' AS [1st Letter]
          , '2544' AS [2nd Letter]
          , '1254' AS [3rd Letter]
          , '64' AS [4th Letter]
          ) AS t

我承认我并不完全理解 PIVOT 和 UNPIVOT,但是我似乎无法确定它是否适用于这个查询?所需的输出将是

Dept       |ACCOUNTS
Month      |May
1st Letter |3254
2nd Letter |2544
3rd Letter |1254
4th Letter |64

我在 Google 上看到了很多解决方案,但并不是真正适合我正在寻找的解决方案,unpivot 是否会为我执行以下操作。

【问题讨论】:

archive.msdn.microsoft.com/SQLExamples/Wiki/… 您想取消透视,以便每个字母都有一列,对吗?你的表中有固定数量的字母吗? 【参考方案1】:

是的。它只是工作。

declare @t table (Dept varchar(20), Month varchar(20), [1st letter]varchar(20),[2nd letter]varchar(20),[3rd letter]varchar(20),[4th letter]varchar(20))
insert @t 
SELECT 'ACCOUNTS' AS Dept
          , DATENAME(MONTH, GETDATE()) AS [Month]
          , '3254' AS [1st Letter]
          , '2544' AS [2nd Letter]
          , '1254' AS [3rd Letter]
          , '64' AS [4th Letter]

SELECT  * FROM @t AS t
    unpivot (item for value in (Dept, Month, [1st letter],[2nd letter],[3rd letter],[4th letter])) u

【讨论】:

ahhh,所以在枢轴中,“值的项目”指定枢轴的行名称。我从来不明白。完美,谢谢!【参考方案2】:
SELECT
  unpvt.[key],
  unpvt.[value]
FROM
  t
UNPIVOT
(
  [key] FOR [value] IN ([Dept],[Month],[1st letter],[2nd letter],[3rd letter],[4th letter])
)
  AS unpvt

UNPIVOT 有效地连接了一个包含两列的新表。在[key][value] 的情况下。

[key] 是字段名的字符串表示形式。

[value] 是存储在该字段中的值。

IN 列表允许您指定要透视的字段。

注意:这确实意味着您需要提前知道完整的字段名称列表;如果您将它们添加到表中,它不会动态调整以包含更多字段。另外,当您的字段具有不同的数据类型时请注意(尽管您的示例中不是这种情况)

【讨论】:

以上是关于转置列或反透视 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

转置列 Oracle sql

如何转置 Excel 数据透视表

以“错误”的方式呈现表格:转置列和行?

在 SQL 中转置列和行的简单方法?

如何在 PIG 中转置列和行

分组在聚合参数和 NULL 替换中设置列