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

How can I perform a group by inside my case statement in SQL

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

它目前正在运行,但我希望它现在对每个 "Jobs" 列具有相同 EmpName 和 return 的所有雇主求和。

所以我需要固定排名,以便它找到按名称分组的最大雇主,然后我需要在 select 语句中 returned 该值。如何实现?

声明:

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

这是一些示例数据:

Input:

EmpName   Employees    City
Emp1      100          Los Angeles
Emp2      150          Phoenix
Emp3      50           Los Angeles
Emp1      20           Los Angeles
Emp1      100          Los Angeles
Emp2      150          Phoenix
Emp3      50           Los Angeles
Emp1      20           Los Angeles

Ouput:

City         Top1_Employer   Top1_Jobs   Top2_Employer   Top2_Jobs
Los Angeles  Emp1            240         Emp2            150
Phoenix      Emp2            300         NULL            NULL
.....

您想对 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