【问题标题】:SQL Server - Transposing Rows to ColumnsSQL Server - 将行转换为列
【发布时间】:2017-10-20 20:36:17
【问题描述】:

我们的 MSSQL 数据库中有一个表,用于存储 Office Person 关系数据。表结构为

CREATE TABLE (
    OfficeID UNIQUEIDENTIFIER
    PersonID UNIQUEIDENTIFIER
    Designation VARCHAR(20)
)

表格会有价值

    E1F5ECA9-7D5A-4580-AA7D-0003A582F286|E1F5ECA9-7D5A-3580-AA7D-0003A582F286|Manager
    E1F5ECA9-7D5A-4580-AA7D-0003A582F286|E1F5ECA9-7D5A-3580-AA7D-0003A582F286|Engineer
    E2F5ECA9-7D5A-4580-AA7D-0003A582F286|E2F5ECA9-7D5A-3580-AA7D-0003A582F286|Manager
    E2F5ECA9-7D5A-4580-AA7D-0003A582F286|E2F5ECA9-7D5A-3580-AA7D-0003A582F286|Engineer

我想要的是每个办公室只能有一名经理和一名工程师。我期待的输出是

OfficeID|Manager ID| Engineer ID|
E1F5ECA9-7D5A-4580-AA7D-0003A582F286|E1F5ECA9-7D5A-3580-AA7D-0003A582F286| E1F5ECA9-7D5A-3580-AA7D-0003A582F286
E2F5ECA9-7D5A-4580-AA7D-0003A582F286|E2F5ECA9-7D5A-3580-AA7D-0003A582F286|E2F5ECA9-7D5A-3580-AA7D-0003A582F286

如何形成查询以获取这种格式的数据?

问候,

约翰

【问题讨论】:

标签: sql-server sql-server-2012 ssms


【解决方案1】:

使用条件聚合:

select 
    OfficeId
  , ManagerId  = max(case when Designation = 'Manager'  then PersonId end)
  , EngineerId = max(case when Designation = 'Engineer' then PersonId end)
from t
group by OfficeId

或使用pivot():

select
    OfficeId
  , ManagerId = Manager
  , EngineerId = Engineer
from t
pivot (max(PersonId) for Designation in ([Manager],[Engineer])) p

rextester 演示:http://rextester.com/OTFBIS66929

【讨论】:

    猜你喜欢
    • 2021-02-24
    • 2010-10-22
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多