2017-04-14 36 views
0

我想要做的是獲得每個工作合格人員的數量。如何查找每個工作的合格人數SQL

如果一個人擁有工作所需的所有技能,他就有資格獲得工作。

表:

工作(JOB_CODE,JOB_NAME)

Job_skill(JOB_CODE,s_code)

技能(s_code,skill_name)

人(per_id ,電子郵件)

Person_skill(per_id,s_code)

我一直停留在以下僞使用減號這樣:

For each job 
From a table of jobs and persons 
    Where not exits 
     For each person 
      Get jobs of each person 

      Minus 

      Get the skills of job 

     Remove appropriate person 

但是,我覺得這個邏輯不正確,可能會去完全走錯了路。

任何幫助表示讚賞。

+1

** [編輯] **你的問題,並添加一些樣本數據和基於該數據的預期輸出。 [**格式化文本**](http://stackoverflow.com/help/formatting)請,[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload圖像-的代碼上那麼當-要價-A-問題/ 285557#285557) –

回答

2

有必要爲一個循環:

鑑於此設置:

create table Job(job_code varchar(10), job_name varchar(100)); 

insert into job values ('dev', 'Developer'); 
insert into job values ('mgr', 'Manager'); 
insert into job values ('designer', 'WebDesigner'); 

create table Job_skill(job_code varchar(10), s_code varchar(10)); 
insert into job_skill values ('dev', 'sql'); 
insert into job_skill values ('dev', 'java'); 
insert into job_skill values ('dev', 'oop'); 
insert into job_skill values ('mgr', 'ppt'); 
insert into job_skill values ('mgr', 'outlook'); 
insert into job_skill values ('designer', 'html'); 
insert into job_skill values ('designer', 'css'); 
insert into job_skill values ('designer', 'graphics'); 

create table Person(per_id integer, name varchar(254)); 
insert into person values (1, 'Arthur'); 
insert into person values (2, 'Zaphod'); 
insert into person values (3, 'Tricia'); 
insert into person values (4, 'Ford'); 

create table Person_skill(per_id integer, s_code varchar(10)); 

insert into person_skill values (1, 'sql'); 
insert into person_skill values (1, 'java'); 
insert into person_skill values (1, 'oop'); 

insert into person_skill values (2, 'ppt'); 

insert into person_skill values (3, 'html'); 
insert into person_skill values (3, 'css'); 
insert into person_skill values (3, 'graphics'); 

insert into person_skill values (4, 'ppt'); 
insert into person_skill values (4, 'outlook'); 

亞瑟是作爲一個合格的開發人員,特里西婭作爲的webdesigner和福特作爲一個經理。 Zaphod只能使用Outlook,所以他缺乏PowerPoint技能成爲經理。

下面的查詢顯示,對於每個人:

with skill_count as (
    select ps.per_id, 
     js.job_code, 
     count(js.s_code) as num_skills 
    from person_skill ps 
    join job_skill js on ps.s_code = js.s_code 
    group by ps.per_id, js.job_code 
    order by ps.per_id 
), required_skills as (
    select job_code, count(*) as num_required 
    from job_skill 
    group by job_code 
) 
select p.name, 
     sc.job_code, 
     case 
     when sc.num_skills = rs.num_required then 'qualified' 
     else 'not qualified' 
     end as status 
from skill_count sc 
    join required_skills rs on sc.job_code = rs.job_code 
    join person p on sc.per_id = p.per_id 
order by p.name; 

根據樣本數據的結果是:

name | job_code | status  
-------+----------+-------------- 
Arthur | dev  | qualified  
Ford | mgr  | qualified  
Tricia | designer | qualified  
Zaphod | mgr  | not qualified