在多个外键上应用分组依据

时间:2018-10-31 10:41:08

标签: sql oracle

我有一个表Jobs,其中有五列:

Skill1, Skill2, Skill3, Skill4, Skill5

每个列都与作为外键的同一表Job_Skill_Cat链接。

我想计算与每种技能相关的工作数量。

输出应类似于

Java (5)jobs
C++ (23)jobs
Python (34)jobs

我已经尽力了,但是我只能提取与skill1相关的工作。

SELECT 
    COUNT(JOB_ID), skill_name  
FROM
    jobs 
INNER JOIN
    job_skill_cat ON jobs.emplj_skill1 = job_skill_cat.skill_id 
GROUP BY
    skill_name

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

取消数据透视和getCustomProjects

join

在Oracle 12C +中,您可以为此目的使用横向联接来代替select jsc.skill_name, count(*) from ((select job_id, skill1 as skill from jobs) union all (select job_id, skill2 as skill from jobs) union all (select job_id, skill3 as skill from jobs) union all (select job_id, skill4 as skill from jobs) union all (select job_id, skill5 as skill from jobs) ) j join job_skill_cat jsc on j.emplj_skill1 = jsc.skill_id group by jsc.skill_name;

基本上,您的数据模型较差。您应该有一个union all表,其中每个作业和每个技能一行。

答案 1 :(得分:0)

您需要UNION ALL并执行JOIN

SELECT skill_id, skill_name, COUNT(*)
FROM (SELECT Skill1 AS Skill
      FROM Jobs J UNION ALL
      SELECT Skill2
      FROM Jobs J UNION ALL
      SELECT Skill3
      FROM Jobs J UNION ALL
      SELECT Skill4
      FROM Jobs J UNION ALL
      SELECT Skill5
      FROM Jobs J
     ) j INNER JOIN 
     job_skill_cat jsc
     ON jsc.skill_id = j.Skill
GROUP BY skill_id, skill_name;

答案 2 :(得分:0)

首先,我们将数据转换为行,然后将其分组并计算技能数量

 WITH c AS (
 SELECT DISTINCT job_Id, skill
 FROM jobs j CROSS APPLY
      ( VALUES (skill1), (skill2), (skill3), (skill4), (skill5)
      ) jb (skill)
 ) 
SELECT skill,COUNT(job_Id)
FROM c
GROUP BY skill ;