如何在SQL中的case语句中执行组

时间:2017-05-15 18:11:24

标签: sql sql-server group-by case row-number

在下面的查询中,我试图在每个城市的数据库中找到前2名雇主姓名和员工人数。

它目前正在运作,但我希望它现在将具有相同EmpName的所有雇主相加并将其返回给每个" Jobs"列。

所以我需要修正等级,以便找到按名称分组的最大雇主,然后我需要在select语句中返回该值。如何实现这一目标?

声明:

SELECT DISTINCT GROUP_CONCAT(NAME SEPARATOR ',') as subsets 
FROM TABLE_1
GROUP BY PARENT_ID;

以下是一些示例数据:

SELECT
    x.City,
    MAX(CASE WHEN x.rk = 1 THEN x.EmpName END) AS Top1_Employer,
    MAX(CASE WHEN x.rk = 1 THEN x.Employees END) AS Top1_Jobs,
    MAX(CASE WHEN x.rk = 2 THEN x.EmpName END) AS Top2_Employer,
    MAX(CASE WHEN x.rk = 2 THEN x.Employees END) AS Top2_Jobs

FROM(SELECT emp.*, ROW_NUMBER() OVER(PARTITION BY emp.City ORDER BY 
emp.Employees desc) AS rk FROM Employer emp) x

GROUP BY x.City

1 个答案:

答案 0 :(得分:1)

您希望对city和empname进行汇总,以根据每个城市中的人员和排名来查找员工总数。然后转动结果。

试试这个:

select City,
    MAX(case when rk = 1 then EmpName end) as Top1_Employer,
    MAX(case when rk = 1 then Employees end) as Top1_Jobs,
    MAX(case when rk = 2 then EmpName end) as Top2_Employer,
    MAX(case when rk = 2 then Employees end) as Top2_Jobs,
    MAX(case when rk = 3 then EmpName end) as Top3_Employer,
    MAX(case when rk = 3 then Employees end) as Top3_Jobs,
    MAX(case when rk = 4 then EmpName end) as Top4_Employer,
    MAX(case when rk = 4 then Employees end) as Top4_Jobs,
    MAX(case when rk = 5 then EmpName end) as Top5_Employer,
    MAX(case when rk = 5 then Employees end) as Top5_Jobs
from (
    select city,
        empname,
        sum(Employees) as Employees,
        ROW_NUMBER() over (
            partition by emp.City order by sum(Employees) desc
            ) as rk
    from Employer emp
    group by City,
        empname
    ) x
group by City

Demo