EDIT 1:两种解决方案和 DUPE 链接都有效,但它们都没有保留我想要的列顺序。所有解决方案均按字母顺序对结果列名称进行排序。如果有人有解决方案,请在评论中发表。
EDIT 2: @taryn https://stackoverflow.com/users/426671/taryn已发布此内容SQL小提琴 http://www.sqlfiddle.com/#!18/56afd/15/0在评论中,这也对列进行排序:)
我见过无数关于做这样的事情的答案,但没有一个是我想要实现的。几乎所有这些都涉及进行聚合或分组。因此,在您急于将此标记为 DUPE 之前,请先完整阅读该问题。
我要做的就是将行转置为列,原始结果集的列名称成为新结果集第一列的行值。
这是我的数据的样子,以及我想要如何将其转换/转置。
我对其进行了颜色编码,以便您可以快速清晰地理解这一点。
在 Excel 中,我将通过选择第一个表,复制它,然后右键单击并将其粘贴为特殊粘贴并检查转置复选框。
我试过了PIVOT
and UNPIVOT
似乎都没有给我我想要的东西。我可能没有正确使用它,但我花了比我预期更多的时间来解决这个问题。
我已经使用源表、示例数据和我在这里期望的内容创建了一个 SQL Fiddle,因此您可以从 =>http://www.sqlfiddle.com/#!18/56afd/10 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