编辑1: 两种解决方案和DUPE链接都可行,但没有一种保留我想要的列顺序。所有解决方案都会按字母顺序排序结果列名。如果有人有解决方案,请在评论中发布。
编辑2: @taryn 在评论中发布了这个SQL Fiddle,它也可以对列进行排序 :)
我看过无数个做类似事情的答案,但都不是我想要实现的内容。几乎所有方案都涉及聚合或分组。所以在您急于将此标记为DUPE之前,请先完全阅读问题。
我所要做的就是将行转置为列,原始结果集的列名成为新结果集第一列的行值。
以下是我的数据样子,以及我想要如何转换 / 转置它们的方式。
我已经用彩色代码来使您快速、清晰地理解这一点。
在Excel中,我会选择第一个表格,复制它,然后右键单击并将其粘贴为特殊粘贴并选中转置复选框。
我尝试了PIVOT
和UNPIVOT
,但都没有给我想要的结果。我可能没有正确使用它,但是我花费了比预期更多的时间来尝试解决这个问题。
我已经创建了一个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