我有两张桌子
Table 1 Table 2
|leadid|Location| |leadid|leadstatus|
|---------------| |-----------------|
|1 |Japan | |1 | Hired |
|2 |China | |2 | Failed |
|3 |Korea | |3 | Hired |
|4 |Japan | |4 | Hired |
|5 |Japan | |5 | Hired |
我的目标是计算每个国家/地区的访谈次数,并计算每个国家/地区的招聘人数和失败人数。结果表应该是这样的
|Location|Interview|Hired|Failed|
|-------------------------------|
|Japan | 3 |3 |0 |
|Korea | 1 |1 |0 |
|China | 1 |0 |1 |
我已经完成了每个国家的访谈计数。我的问题是我无法计算每个国家的招聘人数和失败人数。 这是我目前的MySQL代码:
SELECT Location, count(*) as Interview
FROM table1
GROUP BY Location
ORDER BY Interview DESC
答案 0 :(得分:18)
这应该适合你:
SELECT Location, COUNT(*) as Interview,
SUM(CASE WHEN leadstatus = 'Hired' THEN 1 ELSE 0 END) as Hired,
SUM(CASE WHEN leadstatus = 'Failed' THEN 1 ELSE 0 END) as Failed
FROM table1
LEFT JOIN table2 ON table1.leadid = table2.leadid
GROUP BY Location
ORDER BY Interview DESC
Here是一个有效的方法。
答案 1 :(得分:9)
您可以使用条件和以及使用用户定义变量的排名系统
select
@rn:=@rn+1 as rank,
location,
interview,
hired,
failed
from(
select
t1.location,
count(*) as interview,
sum(t2.leadstatus='Hired') as hired,
sum(t2.leadstatus='Failed') as failed
from table1 t1
join table2 t2 on t1.leadid = t2.leadid
group by t1.location
order by interview desc
)x,(select @rn:=0)y
order by rank ;
答案 2 :(得分:6)
已经测试过了。请找SQL FIDDLE LINK
SELECT
t1.leadid,
t1.Location,
count( t2.leadstatus ) Location,
count(case when t2.leadstatus = 'Hired' then t2.leadstatus end) as Hired,
count(case when t2.leadstatus = 'Failed' then t2.leadstatus end) as Failed
FROM table1 AS t1
INNER JOIN table2 AS t2
ON t1.leadid = t2.leadid
GROUP BY t1.Location,t2.leadstatus
Order BY Hired DESC
答案 3 :(得分:5)
Select location,count(*) as Interview,
SUM(CASE WHEN (status='Hired')Then 1 Else 0 END) as Hired,
SUM(CASE WHEN(status='Failed') Then 1 Else 0 END) as Failed
from loc inner join status on loc.leadid= status.leadid
group by location;
第一个表 loc 包含 leadid 和位置,第二个表状态包含 leadid 和状态
答案 4 :(得分:4)
SELECT table1.location, COUNT(*) as Interview,
COUNT(CASE WHEN table2.leadstatus = 'hired' THEN table2.leadstatus END) as Hired,
COUNT(CASE WHEN table2.leadstatus = 'failed' THEN table2.leadstatus END) as Failed
FROM table1
INNER JOIN table2 ON table1.leadid = table2.leadid
GROUP BY table1.location
ORDER BY Interview DESC;
答案 5 :(得分:4)
这里只需要简单的条件聚合。除了将两张桌子连在一起外:
select t1.location, count(*) as Interview,
count(case when t2.leadstatus = 'hired' then t2.leadstatus end) as Hired,
count(case when t2.leadstatus = 'failed' then t2.leadstatus end) as Failed
from table1 t1
inner join table2 t2
on t1.leadid = t2.leadid
group by t1.location
count()
只计算非空字段,case
语句结果为null
时不满足条件。适用于大量用例的便捷技术。
这仅包括至少有一次访谈的地点。如果您希望包含所有国家/地区,请将inner join
更改为left join
。