转置列或取消忽略SQL查询

时间:2014-05-09 09:36:28

标签: sql sql-server-2008 pivot unpivot

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

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

我在谷歌上看过很多解决方案,但并不是我想要的解决方案,对于我来说,这是不会做的事情。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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列表允许您指定要转动的字段。

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