0

次のテーブルがあります。

ここに画像の説明を入力

スキーマ

tbl_semester_empid {id, semester_name varchar(50), start_date}

tbl_batch_empid {id, semester_id,batch_name, session_room}

tbl_associate_empid {id、associate_name、batch_id、contact、join_date、induction_result、stream_result int}

問題のクエリは次のとおりです。学期ごとの仲間数を表示します。

私は3つのクエリを書きました:

--basic query
SELECT s.ID "Semester Id", COUNT(*) "Associate Count" FROM TBL_SEMESTER_593932 s, TBL_ASSOCIATE_593932 a, TBL_BATCH_593932 b 
        WHERE s.ID=b.SEMESTER_ID AND a.BATCH_ID=b.ID  
                GROUP BY s.ID;

--used NVL function
SELECT s.ID "Semester Id", NVL(COUNT(*),0) "Associate Count" FROM TBL_SEMESTER_593932 s, TBL_ASSOCIATE_593932 a, TBL_BATCH_593932 b 
        WHERE s.ID=b.SEMESTER_ID AND a.BATCH_ID=b.ID  
                GROUP BY s.ID;

-- used LEFT OUTER JOIN and  JOIN
SELECT s.ID "Semester Id", NVL(COUNT(*),0) "Associate Count" 
        FROM TBL_SEMESTER_593932 s LEFT OUTER JOIN TBL_BATCH_593932 b ON s.ID=b.SEMESTER_ID 
             JOIN TBL_ASSOCIATE_593932 a ON a.BATCH_ID=b.ID  
                   GROUP BY s.ID;

それらのすべてが次の出力を表示します (少なくとも 1 人の学生がいる学期に対応するレコードのみが表示されます。その学期に学生がいない場合、その学期の情報は表示されません)。

ここに画像の説明を入力

アソシエート数列にアソシエートがいない学期を 0 にします。そこで、2 つの LEFT OUTE JOIN で同じことを試しました。

SELECT s.ID "Semester Id", NVL(COUNT(*),0) "Associate Count" 
    FROM TBL_SEMESTER_593932 s LEFT OUTER JOIN TBL_BATCH_593932 b ON s.ID=b.SEMESTER_ID 
         LEFT OUTER JOIN TBL_ASSOCIATE_593932 a ON a.BATCH_ID=b.ID  
                GROUP BY s.ID;

ただし、結果は奇妙です。

ここに画像の説明を入力

4

2 に答える 2

1

基本的に、あなたがしなければならないことは、利用可能なすべての学期のリストを使用して、それぞれの学期の金額を計算することです:

select s.ID, 
       s.Semester_Name,
       NVL ((select count(*) 
          from TBL_ASSOCIATE_593932 a
               join TBL_BATCH_593932 b 
                 on a.BATCH_ID=b.ID
        where  s.ID=b.SEMESTER_ID
       ),0) as Amount
 from TBL_SEMESTER_593932 s

別のアプローチは、すべての学期のリストに追加してからカウントすることです

select s.ID, 
       s.Semester_Name,
       count(*) as Amount 
 from TBL_SEMESTER_593932 s
        left join (
          TBL_BATCH_593932 b
          join TBL_ASSOCIATE_593932 a  
            on a.BATCH_ID=b.ID)
           on s.ID=b.SEMESTER_ID

group by s.ID, s.Semester_Name
order by s.ID

[編集]: 最後のクエリは @Mahesha999 に従って修正されました。

于 2013-01-09T06:43:54.517 に答える
1

使ってみましたCASE whenか?

関連テーブルのデータによると、すべてのバッチ/学期のレコードがあります。

だからこれを試してみてください、あなたのNVLはケースに似ています...

select s.id, s.name, CASE WHEN count(a.id) IS NULL THEN 0 ELSE count(a.id) END as ACount
from tblsem s
left join tblbatch b
on b.sid = s.id
left join tblaso a
on b.id = a.batchid
group by s.id, s.name
;

結果:

ID  NAME    ACOUNT
1   sem1    4
2   sem2    3
3   sem3    0
于 2013-01-09T06:31:57.643 に答える