У меня есть таблица 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
Любая помощь будет принята с благодарностью.
Разверните данные и 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;
Сначала мы конвертируем данные в строки, а затем группируем их и подсчитываем количество навыков.
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 ;
@AliTahir. . . Включите этот столбец в пункт
GROUP BY
.