首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL选择总计,然后分裂成成功和失败。

SQL选择总计,然后分裂成成功和失败。
EN

Stack Overflow用户
提问于 2015-05-19 05:26:35
回答 6查看 9.3K关注 0票数 22

我有两张桌子

代码语言:javascript
复制
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    |

我的目标是统计每个国家的面试次数,以及每个国家的招聘人数和失败人数。生成的表应该如下所示

代码语言:javascript
复制
|Location|Interview|Hired|Failed|
|-------------------------------|
|Japan   | 3       |3    |0     |
|Korea   | 1       |1    |0     |
|China   | 1       |0    |1     |

我已经统计了每个国家的采访次数。我的问题是,我无法计算每个国家的雇员人数和失败人数。下面是我目前的MySQL代码:

代码语言:javascript
复制
SELECT Location, count(*) as Interview 
FROM table1 
GROUP BY Location 
ORDER BY Interview DESC
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-05-19 05:37:04

这应该适用于你:

代码语言:javascript
复制
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

这里是一个工作的小木琴。

编辑2019年:这可以在不使用case语句的情况下简化,因为条件语句本身返回1或0,因此您可以简单地对此进行SUM()

代码语言:javascript
复制
SELECT Location, COUNT(*) as Interview,
SUM(leadstatus = 'Hired') as Hired,
SUM(leadstatus = 'Failed') as Failed
FROM table1 
LEFT JOIN table2 ON table1.leadid = table2.leadid
            GROUP BY Location 
            ORDER BY Interview DESC

这里是更新的sqlfiddle。

票数 21
EN

Stack Overflow用户

发布于 2015-05-19 05:46:29

可以使用用户定义的变量使用条件和排序系统,如

代码语言:javascript
复制
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 ;
票数 8
EN

Stack Overflow用户

发布于 2015-05-19 05:43:33

测试过这个。请找到SQL小提琴链接

代码语言:javascript
复制
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

小提琴

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30317386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档