Применение group by к нескольким внешним ключам

У меня есть таблица 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

Любая помощь будет принята с благодарностью.

0
0
35
3

Ответы 3

Разверните данные и join:

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;

В Oracle 12C + для этой цели можно использовать боковое соединение вместо union all.

По сути, у вас плохая модель данных. У вас должна быть таблица job_skills с одной строкой для каждого задания и навыка.

Вам нужен 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;

@AliTahir. . . Включите этот столбец в пункт GROUP BY.

Yogesh Sharma 31.10.2018 12:27

Сначала мы конвертируем данные в строки, а затем группируем их и подсчитываем количество навыков.

 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 ;

Другие вопросы по теме