2017-03-03 11 views
4

私は2つのテーブルを持っています。私は、各ユーザーのスキルaがどれくらい仕事に合っているかを一致させたい。 テーブル構造は、私がカンマで区切られたスキルを持っており、比較しようとしていたが、これらは異なる順序にすることができSQLサーバーの列に2つのテーブルが一致する

Table1: User_Skills 
| ID | User_ID | Skill | 
--------------------------- 
| 1 | 1  | .Net | 
--------------------------- 
| 2 | 1  | Software| 
--------------------------- 
| 3 | 1  | Engineer| 
--------------------------- 
| 4 | 2  | .Net | 
--------------------------- 
| 5 | 2  | Software| 
--------------------------- 

Table2: Job_Skills_Requirement 
| ID | Job_ID | Skill  | 
-------------------------- 
| 1 | 1  | .Net | 
--------------------------- 
| 2 | 1  | Engineer| 
--------------------------- 
| 3 | 1  | HTML | 
--------------------------- 
| 4 | 2  | Software| 
--------------------------- 
| 5 | 2  | HTML | 
--------------------------- 

です。

すべての回答が優れています。私が探している結果は、すべてのユーザーをすべてのジョブと後で照合することです。他のプロパティとも一致します。

+0

あなたがすでに試したことを忘れないでください。 –

+0

質問を編集して、結果を表示してください。 –

答えて

2

とすべてのユーザーとのすべてのジョブに一致すると、Mureinikのその他の優れた回答は正しくありません。

あなたは、私がcross joinを使用して行い、その後、マッチングのものを数えることになる、最初にすべての行を生成する必要があります。

select u.user_id, j.job_id, count(jsr.job_id) as skills_in_common 
from users u cross join 
    jobs j left join 
    user_skills us 
    on us.user_id = u.user_id left join 
    Job_Skills_Requirement jsr 
    on jsr.job_id = j.job_id and 
     jsr.skill = us.skill 
group by u.user_id, j.job_id; 

注:これはusersの存在とjobsテーブルを想定しています。もちろん、サブクエリを使用してこれらを生成できます。

6

あなたはskill列でテーブルを結合し、マッチを数えることができる:

SELECT user_id, job_id, COUNT(*) AS matching_skills 
FROM  user_skills u 
JOIN  job_skills_requirement j ON u.skill = j.skill 
GROUP BY user_id, job_id 

EDIT:
あなたも一致するスキルを持っていないユーザーやジョブを表示したい場合は、代わりにfull outer joinを使用することができます。

SELECT   user_id, job_id, COUNT(*) AS matching_skills 
FROM   user_skills u 
FULL OUTER JOIN job_skills_requirement j ON u.skill = j.skill 
GROUP BY  user_id, job_id 

EDIT 2:
ジリTousekがコメントしたように、上記のクエリは、ユーザとジョブの間に一致がないnull Sを生成します。あなたがそれらの間の完全なデカルト積をしたい場合は、(?乱用)cross join構文を使用して、実際には各ユーザーと各ジョブの間で一致してどのように多くのスキルを数えることができる:あなたがしたい場合

SELECT  user_id, 
      job_id, 
      COUNT(CASE WHEN u.skill = j.skill THEN 1 END) AS matching_skills 
FROM  user_skills u 
CROSS JOIN job_skills_requirement j 
GROUP BY user_id, job_id 
+0

どのスキルが共通していない組み合わせに対しても、これはどのように機能しますか? –

+0

@ JiriTousek 'JOIN'のために除外します。不一致を含める場合は、 'JOIN'ではなく' LEFT JOIN'にする必要があります。 LEFT JOINには、結合の左側にある表の行が含まれます。これらの行は、結合の右側にある表のどの行とも一致しません。一致する行がない場合、右側の表の列はNULLになります。 –

+0

@ JiriTousek現在のクエリでは、一致のないユーザーとジョブは省略されます。それらを表示したい場合は、内部結合の代わりに完全外部結合を使用することができます - 詳細については私の編集された答えを参照してください。 – Mureinik

2
WITH User_Skills(ID,User_ID,Skill)AS(
    SELECT 1,1,'.Net' UNION ALL 
    SELECT 2,1,'Software' UNION ALL 
    SELECT 3,1,'Engineer' UNION ALL 
    SELECT 4,2,'.Net' UNION ALL 
    SELECT 5,2 ,'Software' 
),Job_Skills_Requirement(ID,Job_ID,Skill)AS(
    SELECT 1,1,'.Net' UNION ALL 
    SELECT 2,1,'Engineer' UNION ALL 
    SELECT 3,1,'HTML' UNION ALL 
    SELECT 4,2,'Software' UNION ALL 
    SELECT 5,2 ,'HTML' 
),Job_User_Skill AS (
    SELECT j.Job_ID,u.User_ID,u.Skill 
    FROM Job_Skills_Requirement AS j INNER JOIN User_Skills AS u ON u.Skill=j.Skill 
) 
SELECT jus.Job_ID,jus.User_ID,COUNT(jus.Skill),STUFF(c.Skills,1,1,'') AS Skill 
FROM Job_User_Skill AS jus 
CROSS APPLY(SELECT ','+j.Skill FROM Job_User_Skill AS j WHERE j.Job_ID=jus.Job_ID AND j.User_ID=jus.User_ID FOR XML PATH('')) c(Skills) 
GROUP BY jus.Job_ID,jus.User_ID,c.Skills 
ORDER BY jus.Job_ID 
 
Job_ID  User_ID     Skill 
----------- ----------- ----------- ------------- 
1   1   2   .Net,Engineer 
1   2   1   .Net 
2   1   1   Software 
2   2   1   Software 
関連する問題