2016-09-27 4 views
0

SQL結合で表を結合する際に問題があります。私はテーブルCのNationalAvgとテーブルBの列SchoolAvgの両方を組み合わせたいと思いますが、私のクエリはどれも正しいわけではありません。私はSchoolAvgSQL結合結合

select Round(Cast(AVG(me.members_exams_score)as float), 2) as SchoolAvg, e.exams_description, s.schools_name 
from members_exams as me 
left join exams as e on e.exams_id = me.exams_id 
join schools as s on s.schools_id = me.schools_id 
where me.members_exams_score is not null 
group by e.exams_description, s.schools_name 
order by s.schools_name 

結果

+--------------------+-------------------+--------------+ 
|SchoolAvg   | exams_description | School  | 
+--------------------+-------------------+--------------- 
| .90    | Medical Asst.Exam | School A  | 
| .88    | Health Exam  | School A  | 
| .65    | EKG Exam   | School A  | 
| .76    | Phlebotomy  | School A  | 
| .93    | Medical Asst.Exam | School B  | 
| .79    | Health Exam  | School B  | 
| .82    | EKG Exam   | School B  | 
| .76    | Phlebotomy  | School B  | 
+--------------------+-------------------+--------------+ 
を得ることができます - 私はNationalAvg

Select Round(Cast(AVG(me.members_exams_score)as float), 2) as NationalAvg, e.exams_description 
from members_exams as me 
left join exams as e on e.exams_id = me.exams_id 
join schools as s on s.schools_id = me.schools_id 
where me.members_exams_score is not null 
group by e.exams_description 

結果

+--------------------+-------------------+ 
|NationalAvg   | exams_description | 
+--------------------+-------------------+ 
| .78    | Medical Asst.Exam | 
| .90    | Health Exam  | 
| .79    | EKG Exam   | 
| .81    | Phlebotomy  | 
+--------------------+-------------------+ 

表Bを得ることができます -

表A

不正な結合表 - 両方のSchoolAvgが必要です。& NationalAvg。 NationalAvg列が表示されません。

select Round(Cast(AVG(me.members_exams_score)as float), 2) as SchoolAvg, e.exams_description, s.schools_name 
from members_exams as me 
left join exams as e on e.exams_id = me.exams_id 
join schools as s on s.schools_id = me.schools_id 
join 
     (select Round(Cast(AVG(me.members_exams_score)as float), 2) as NationalAvg 
     from members_exams as me 
     left join exams as e on e.exams_id = me.exams_id 
     join schools as s on s.schools_id = me.schools_id 
     group by e.exams_description) nAvg on e.exams_id = nAvg.NationalAvg 
where me.members_exams_score is not null 
group by s.schools_name, e.exams_description 

結果 -

+------------------+--------------------+-------------------+--------------+ 
| School Avg  |NationalAvg   | exams_description | School  | 
+------------------+--------------------+-------------------+--------------| 
| .90    | .78    | Medical Asst.Exam | School A  | 
| .88    | .90    | Health Exam  | School A  | 
| .65    | .79    | EKG Exam   | School A  | 
| .76    | .81    | Phlebotomy  | School A  | 
| .93    | .78    | Medical Asst.Exam | School B  | 
| .79    | .90    | Health Exam  | School B  | 
| .82    | .79    | EKG Exam   | School B  | 
| .76    | .81    | Phlebotomy  | School B  | 
+------------------+--------------------+-------------------+--------------+ 

おかげで、

答えて

0

てみたCTEにあなたのロジックを追加し、そのように参加 - B.
意図した結果と同じテーブルを持ち帰るています。

With CTE1 as(
    Select Round(Cast(AVG(me.members_exams_score)as float), 2) as NationalAvg, e.exams_description 
    from members_exams as me 
    left join exams as e on e.exams_id = me.exams_id 
    join schools as s on s.schools_id = me.schools_id 
    where me.members_exams_score is not null 
    group by e.exams_description 
),CTE2 as (
    select Round(Cast(AVG(me.members_exams_score)as float), 2) as SchoolAvg, e.exams_description, s.schools_name 
    from members_exams as me 
    left join exams as e on e.exams_id = me.exams_id 
    join schools as s on s.schools_id = me.schools_id 
    where me.members_exams_score is not null 
    group by e.exams_description, s.schools_name 
) 
select A.exams_description, A.NationalAvg, B.schools_name, B.SchoolAvg 
from CTE A 
left Join CTE1 B ON A.exams_description = B.exams_description 
+0

素晴らしいです!乾杯&助けてくれてありがとう。 – Jay

+0

@Jayを聞く素晴らしいニュース!その解決策を受け入れてくれてありがとう – Prob1em

0

入力 - 出力の例を調べると、exams_descriptionの列にある2つの表を結合する必要があります。

すでに2つのサブクエリが作成されているので、2つのサブクエリの結果を結合することができます。

with T1 as(
    select Round(Cast(AVG(me.members_exams_score)as float), 2) as NationalAvg, e.exams_description 
    from members_exams as me 
    left join exams as e on e.exams_id = me.exams_id 
    join schools as s on s.schools_id = me.schools_id 
    where me.members_exams_score is not null 
    group by e.exams_description 
),T2 as (
    select Round(Cast(AVG(me.members_exams_score)as float), 2) as SchoolAvg, e.exams_description, s.schools_name 
    from members_exams as me 
    left join exams as e on e.exams_id = me.exams_id 
    join schools as s on s.schools_id = me.schools_id 
    where me.members_exams_score is not null 
    group by e.exams_description, s.schools_name 
) 
select T2.SchoolAvg, T1.NationalAvg, T2.exams_description, T1.exams_description 
from T1 Join T2 
where T1.examples_description = T2.examples_description;