SQL Server 如何将行转置为列,无需 PIVOT 或 UNPIVOT 或聚合 [重复]

2024-02-27

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

Using 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 如何将行转置为列,无需 PIVOT 或 UNPIVOT 或聚合 [重复] 的相关文章

  • 在 SQL 查询中使用 fn_Split

    我一直在努力争取fn Split在我的查询中正常工作 我到处搜索 并在这里找到了似乎接近我需要的答案 但我仍然无法使其发挥作用 基本上我试图返回与数组中的条目匹配的记录 我已经有了一个与我的数据库一起使用的表值函数 如下所示 Select
  • Google BigQuery:如何使用 SQL 创建新列

    我想在不使用旧版 SQL 的情况下向现有表添加一列 基本的 SQL 语法是 ALTER TABLE table name ADD column name datatype 我格式化了 Google BigQuery 的查询 ALTER TA
  • 选择表中的人员并排除妻子,但合并他们的名字

    我有一张桌子Person PersonID FirstName LastName 1 John Doe 2 Jane Doe 3 NoSpouse Morales 4 Jonathan Brand 5 Shiela Wife And a R
  • Postgres - 这是在布尔列上创建部分索引的正确方法吗?

    我有下表 CREATE TABLE recipemetadata Lots of columns diet glutenfree boolean NOT NULL 大多数每一行都会被设置为FALSE除非有人想出一些席卷全国的疯狂新无麸质饮食
  • SQL Server - 在设置 COLLATE Latin1_General_CS_AS 的情况下搜索不区分大小写

    家长提问 https stackoverflow com questions 50974562 sql server update to match and replace only exact words感谢 Iamdave 部分问题得到
  • SQL查询:按字符长度排序?

    是否可以按字符总数对sql数据行进行排序 e g SELECT FROM database ORDER BY data length 我想你想用这个 http dev mysql com doc refman 5 0 en string f
  • 如何在 where 子句中使用别名? [复制]

    这个问题在这里已经有答案了 可能的重复 在 WHERE 子句中引用列别名 https stackoverflow com questions 8370114 referring to a column alias in a where cl
  • 使用 SQLite 创建列表树

    我正在尝试使用 PHP 和 SQLite 表设置创建一个分层列表 如下所示 itemid parentid name 1 null Item1 2 null Item2 3 1 Item3 4 1 Item4 5 2 Item5
  • SQL:列出多个连接语句中的重复记录?

    你好 以下查询在连接多个表后返回所有员工 select e from dbo EMP e join dbo HREMP a on a ID e ID join dbo LOGO c on c EMPID e id join dbo LOGO
  • 删除 DB 但不删除 *.mdf / *.ldf

    我正在尝试自动化分离和删除数据库的过程 通过 VBS objshell run 如果我手动使用 SSMS 分离和删除我可以将数据库文件复制到另一个位置 但是如果我使用 sqlcmd U sa P MyPassword S local Q A
  • Visual Studio 2008 (C#) 与 SQL Compact Edition 数据库错误:26

    与网络相关或特定于实例的 建立时发生错误 连接到 SQL Server 服务器 未找到或无法访问 验证实例名称是否为 正确并且 SQL Server 是 配置为允许远程 连接 提供商 SQL 网络 接口 错误 26 错误定位 指定服务器 实
  • 在触发器中记录更新操作

    我有一个 UPDATE 触发器 它生成 INSERTED 和 DELETED 表 如下所示 INSERTED Id Name Surname 1 Stack Overflow 2 Luigi Saggese DELETED Id Name
  • Oracle中如何转义单引号? [复制]

    这个问题在这里已经有答案了 我有一列包含某些存储为文本字符串的表达式 其中包括单个引号 例如 错过的交易 包括引号 发生这种情况时如何使用 where 子句 select from table where reason missed tra
  • 寻找多列索引的最佳顺序

    假设我有一个包含两个索引的表 一个位于 a 列 一个位于 a b 和 c 列 我注意到 根据索引定义中列的顺序 MySQL 可能最终使用单列索引而不是多列索引 即使多列索引中的所有三列都在 ON 中引用JOIN 的一部分 这有点引出了一个问
  • 想要从字符格式转换为带小数的数字格式

    想要将字符格式 00001000000 转换为10000 00 请帮我 我已经尝试过 select to number 00012300 9999999999 99 nls numeric characters from dual 这个脚本
  • 获取MySql中重复行的列表

    我有一张这样的桌子 ID nachname vorname 1 john doe 2 john doe 3 jim doe 4 Michael Knight 我需要一个查询 该查询将从具有相同 nachname 和 vorname 的记录
  • C# 事务中的事务

    我正在使用 C 将发票的平面文件导入到数据库中 如果遇到问题 我将使用 TransactionScope 回滚整个操作 这是一个棘手的输入文件 因为一行不一定等于一条记录 它还包括链接记录 发票将包含标题行 行项目和总计行 有些发票需要跳过
  • 选择不带 FROM 但有多于一行的选择

    如何在不从现有表中进行选择的情况下生成 2 行 2 列的表 我正在寻找的是一个返回的选择语句 e g id value 1 103 2 556 Use UNION http dev mysql com doc refman 5 0 en u
  • 如何在一列中存储数组或多个值

    运行 Postgres 7 4 是的 我们正在升级 我需要将 1 到 100 个选定项目存储到数据库的一个字段中 98 的情况下 只会输入 1 个项目 而 2 的情况下 如果是这样的话 会输入多个项目 这些项目只不过是文本描述 截至目前 长
  • sql查询连接两个服务器中不同数据库的两个表

    我在 ServerS 上的数据库中有两个表 tableA 在 ServerB 上的数据库中有两个表 我只想根据这些表的公共字段名对这些表执行 fullouter join 在 SQL Server 中 您可以创建一个链接服务器 在 Mana

随机推荐