如何在 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
在下面的查询中,我试图在我的数据库中找到每个城市的前 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