SQL Server 如何在没有 PIVOT 或 UNPIVOT 或聚合的情况下将行转置为列

标签 sql sql-server tsql pivot transpose

编辑 1: 两种解决方案和 DUPE 链接都有效,但它们都没有保留我想要的列顺序。所有解决方案都按字母顺序对生成的列名称进行排序。如果有人对此有解决方案,请在评论中发表。

编辑 2: @taryn已发布 SQL Fiddle在评论中,列也会排序:)


我已经看到无数关于这样做的答案,但没有一个是我想要实现的。几乎所有都涉及进行聚合或分组。因此,在您急于将其标记为 DUPE 之前,请先完整阅读该问题。

我要做的就是将行转换为列,原始结果集的列名成为新结果集第一列的行值。

这是我的数据的样子,以及我想如何转换/转置它。

enter image description here

我已对其进行了颜色编码,以便您可以快速清晰地理解这一点。

在 excel 中,我会选择第一个表,复制它,然后右键单击并将其粘贴为 选择性粘贴 并选中 Transpose 复选框。

我试过 PIVOTUNPIVOT 似乎都没有给我想要的东西。我可能没有正确使用它,但我花费的时间比我预期的要多。

我已经用源表、示例数据和我在这里的期望创建了一个 SQL Fiddle,所以你可以从 => http://www.sqlfiddle.com/#!18/56afd/10 开始。

这也是内联粘贴的代码。

IF OBJECT_ID ('dbo.Players') IS NOT NULL
    DROP TABLE dbo.Players;

CREATE TABLE dbo.Players
(
      PlayerID INT
    , Win INT
    , Defeat INT
    , StandOff INT
    , CONSTRAINT PK_Players PRIMARY KEY CLUSTERED (PlayerID) ON [PRIMARY]
);
INSERT INTO dbo.Players (PlayerID, Win, Defeat, StandOff)
VALUES
    (1, 7,  6,  9),
    (2, 12, 5,  0),
    (3, 3,  11, 1);

这是预期的输出

SELECT * FROM dbo.Players;

-- Need to Transpose above results, into the following.

-- -------------------------------------------------------------------
-- |    Stat_Type    |    Player_1    |    Player_2    |    Player_3  |
-- -------------------------------------------------------------------
-- |    Win          |       7        |       12       |      3       |
-- -------------------------------------------------------------------
-- |    Defeat       |       6        |       5        |      11      |
-- -------------------------------------------------------------------
-- |    StandOff     |       9        |       0        |      1       |
-- -------------------------------------------------------------------

-- Column Names become Row values for 1st column
-- PlayerId becomes column names

最佳答案

使用UNPIVOT/PIVOT:

WITH unpiv AS (
  SELECT PlayerId, col, value
  FROM dbo.Players
  UNPIVOT (VALUE FOR col IN (Win, Defeat, StandOff)) unpiv
)
SELECT col AS Stat_Type, [1] AS Player1, [2] AS Player2, [3] AS Player3
FROM unpiv
PIVOT (MAX(value) FOR PlayerId IN ([1], [2], [3])) piv
ORDER BY CASE col WHEN 'Win' THEN 1 WHEN 'Defeat' THEN 2 ELSE 3 END;

DBFiddle Demo

关于SQL Server 如何在没有 PIVOT 或 UNPIVOT 或聚合的情况下将行转置为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49761712/

相关文章:

.net - 希望创建客户端应用程序 (WPF) 来对远程数据执行 CRUD 操作

sql - 绕过 OPENQUERY 失败使用 EXECUTE 的字符限制

sql - 如何列出 SQL Server 表的主键?

mysql - 对 mysql 中的所有行执行相同的查询

mysql - 我的 SQL 连接超过 5 个表

sql - 从Sql Server删除所有 View

sql-server - 如何在 SQL Server 2014 中从另一个总和值中减去总和值?

sql - 如何在 SQL Server 中创建序数(即 "1st" "2nd"等)

sql - T-SQL 截断文本并在末尾添加数字以避免重复

mysql - 日期比较周和年格式