2017-04-21 3 views
0

の結合にデフォルト値を追加する私は、次の表があります。ユーザーテーブルの各エントリはコースを表しテーブル

ユーザー

user_id course_id completion_rate 
1  2   0.4 
1  23   0.6 
1  49   0.5 
...  ...  ... 

コース

course_id title 
1   Intro to Python 
2   Intro to R 
...  ... 
70   Intro to Flask 

をユーザーが取った。しかし、すべてのコースを取ったことはまれです。

私が必要とするのは、user_idcourse_idcompletion_rateと設定された結果です。ユーザーがコースを受講した場合は、既存のcompletion_rateを使用する必要がありますが、そうでなければcompletion_rateを0に設定する必要があります。つまり、各コースに1つずつ、user_idごとに70の行があります。

私はSQLに関する多くの経験がありません。どこから始めたらよいか分かりません。 Rのようなものでこれを行う方が簡単でしょうか?

ありがとうございます。

答えて

2

まず、別のユーザーがいるコースcross joinが必要です。それでこの上にleft joinが望ましい結果を得る。ユーザーがコースを受講していない場合、completion_rateはnullになり、​​3210を使用してデフォルトの0を使用します。

select c.course_id,cu.user_id,coalesce(u.completion_rate,0) as completion_rate 
from courses c 
cross join (select distinct user_id from users) cu 
left join users u on u.course_id=c.course_id and cu.user_id=u.user_id 
+0

印象的です。クロス結合に関する詳細はこちら[こちら](http://www.w3resource.com/mysql/advance-query-in-mysql/mysql-cross-join.php) – FrankerZ

+0

私が持っているデータセットでこのクエリを実行していました私はちょうどそれを行うためにPythonスクリプトを書いたので、時間がかかります。これは素晴らしい答えですが、ありがとう! –

0

ステップ1:たclient_data(ABC)からの個別のclient_idを取り、コースデータと1 on 1 mergeを行う(ABC1)。がCLIENT_ID上のクライアント情報と上記データセットをマージするだけでなく、もちろん

create table ans as 
select p.*,case when q.completion_rate is not null then q.completion_rate else 0 
      end as completion_rate 
from 
(
    select a.client_id,b.course from 
     (select distinct client_id from abc) a 
    left join 
     abc1 b 
    on 1=1 
) p 
left join 
abc q 
on p.client_id = q.client_id and p.course = q.course 
order by client_id,course; 

は私が任意のクエリの場合は知ってみましょう:1つのマージの1はそれぞれに対するすべてのコースが

ステップ2をCLIENT_IDライトアップに役立ちます。

+0

合体はコードが少ないようです – Strawberry

+0

平均は半分以下ですか?主な質問は約1 = 1マージでした。クエリの残りの部分については何もしません。 –

+0

ええ、そのビットも不要です。他の答えを見てください。 – Strawberry

関連する問題