【问题标题】:Pivot group multi column SQL透视组多列 SQL
【发布时间】:2018-09-30 16:07:16
【问题描述】:

在 SQL 中,如何将多列合并为具有多行的一列? 示例:

name  |  age  |  gender
------+-------+---------
John  |   20  |    M
Jill  |   21  |    F
Exam  |   22  |    M

我想要这张桌子:

Exam  |  John |  Jill
------+-------+---------
22    |   21  |   20
M     |   F   |   M

【问题讨论】:

  • 你用的是什么 DBMS?
  • @D-Shih:我使用的是 SQL Server 2014

标签: sql sql-server tsql pivot sql-server-2014


【解决方案1】:

你可以这样做。

使用两个PIVOT 查询和UNION ALL 将它们组合起来

SELECT CAST(Exam AS VARCHAR(10)) Exam,
       CAST(Jill AS VARCHAR(10)) Jill,
       CAST(John AS VARCHAR(10)) John
FROM
(
    select age,name
    from T
) as x
PIVOT 
(
    MAX(Age) FOR name IN ([Exam],[John],[Jill])
)AS P1
UNION ALL
SELECT Exam,Jill,John FROM
(
    select name,gender
    from T
) as x
PIVOT 
(
    MAX(gender) FOR name IN ([Exam],[John],[Jill])
)AS P1

sqlfiddle:http://sqlfiddle.com/#!18/a437d/6

【讨论】:

  • 我的数据使用 utf-8 的列名。如何转换列吉尔? CAST(Jill AS VARCHAR(10)) Jill -> 我的意思是 utf-8
  • 我知道如何使用您的脚本。太感谢了。你救了我的命。
【解决方案2】:

您可以使用单个查询来执行此操作——基本上是非透视和条件聚合:

select max(case when v.name = 'Exam' then v.val end) as exam,
       max(case when v.name = 'John' then v.val end) as john,
       max(case when v.name = 'Jill' then v.val end) as jill
from t cross apply
     (values (t.name, cast(t.age as varchar(10)), 1),
             (t.name, t.gender, 2)
     ) v(name, val, which)
group by which;

Here 是 SQL 小提琴。

您可以将值转换为您喜欢的任何字符类型,以实现值之间的兼容性。您希望将数值和字符串放在同一列中,因此它们必须具有相同的类型。

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多