【问题标题】:Main and secondary manager of an employee [duplicate]员工的主要和次要经理[重复]
【发布时间】:2020-01-29 23:06:16
【问题描述】:

我想重新组合员工的主要和次要经理:

EmployeeName    ManagerStatus Manager
Mario           Primary       Rodrigo
Mario           Secondary     Thomas

我想做如下的东西:

EmployeeName    PrimaryManager  SecondaryManager
Mario           Rodrigo         Thomas

【问题讨论】:

标签: sql-server


【解决方案1】:

你想要条件聚合:

select EmployeeName, 
       max(case when ManagerStatus = 'Primary' then Manager end) as PrimaryManager,
       max(case when ManagerStatus = 'Secondary' then Manager end) asSecondaryManager     
from table t
group by EmployeeName;

这假设员工将有一个 primarysecondary 经理。

【讨论】:

    【解决方案2】:

    SQL Fiddle

    MS SQL Server 2017 架构设置

    create table MyTable(EmployeeName varchar(max),ManagerType varchar(max),Manager varchar(max))
    insert into MyTable (EmployeeName,ManagerType,Manager)values
    ('Mario','Primary', 'Rodrigo'),('Mario','Secondary', 'Thomas')
    

    查询 1

    with CTE AS (select *,
    (CASE WHEN ManagerType='Primary' THEN Manager END) AS PrimaryManager,
    (CASE WHEN ManagerType = 'Secondary' THEN Manager END) AS SecondaryManager,
    
    ROW_NUMBER() OVER (PARTITION BY ManagerType,Manager
    
                       Order By EmployeeName DESC) as rn
    from MyTable
    group by EmployeeName,ManagerType,Manager             )
    
    select c.EmployeeName
    ,max(c.PrimaryManager) AS PrimaryManager
    ,max(c.SecondaryManager) AS SecondaryManager
    
    from cte c
    where rn=1
    group by c.EmployeeName
    

    Results

    | EmployeeName | PrimaryManager | SecondaryManager |
    |--------------|----------------|------------------|
    |        Mario |        Rodrigo |           Thomas |
    

    【讨论】:

    • rn 的目的是什么?
    • @Squirrel 用于历史目的,如果每个经理-经理分配都有开始和结束日期
    • 你遥遥领先。我在 OP 的问题中没有看到这一点
    【解决方案3】:

    你可以试试下面的方法。另一种方法是PIVOT and UNPIVOT

    SELECT EmployeeName
        ,max(PrimaryManager) AS PrimaryManager
        ,max(SecondaryManager) AS SecondaryManager
    FROM (
        SELECT EmployeeName
            ,CASE ManagerStatus
                WHEN 'Primary'
                    THEN Manager
                END AS PrimaryManager
            ,CASE ManagerStatus
                WHEN 'Secondary'
                    THEN Manager
                END AS SecondaryManager
        FROM MyTable
        ) a
    GROUP BY EmployeeName
    

    Live Demo

    【讨论】:

    • 请求根据更新后的答案撤回反对票。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2011-03-27
    • 2014-06-08
    • 2018-12-11
    相关资源
    最近更新 更多