SQL选择总计并拆分成功并失败

时间:2015-05-19 05:26:35

标签: mysql sql

我有两张桌子

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

6 个答案:

答案 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

FIDDLE

答案 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;

小提琴 - http://sqlfiddle.com/#!9/269da/14

答案 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

demo here