2016-12-02 21 views
1

SQLで特定のケースを解決する際に問題があります。 モジュール試験 - - 次 構造のORDER BY句のネストされたSQL

私は2つのテーブルを持っています。

モジュール

  • モジュールのコード
  • モジュール名

試験

  • 学生ID
  • モジュールコード

私は、モジュールの人気を低下させる注文を取りたいと思います。 人気は、特定のモジュールの試験の発生によって与えられます。

ORDER BY句内でネストされたクエリを使用したいと思いますが、わかりません。

EDIT:

データサンプル

Module Name | Module Code 
--------------------------------- 
Programming | CS118 
Database | CS230 
Finance  | IB143 
Geometry | MA109 



Student Id | Module Code 
---------------------------------- 
1323  | CS118 
1432  | CS118 
1956  | CS118 
1323  | CS230 
1956  | CS230 
1432  | MA109 
1751  | IB143 

このサンプルを考えるには、私が得ることを期待することは

Programming 
Database 
Finance 
Geometry 

私のRDBMSは、Oracleです。

+1

あなたのrdbmsは何ですか?サンプルデータと期待される出力を提供できますか? –

+0

サンプルテーブルのデータを追加して、希望の順序を表示してください(書式付きテキストで '{}'をクリックしてください)。 – jarlh

+0

モジュールの試験の数(1)で注文したいですか?これは、インラインビューまたはウィンドウ関数(サポートされている場合)を使用して実現することができます – xQbert

答えて

3

シンプルなここでのトリックに

select m."Module name" 
from Module m 
left join Exam e 
    on (m."Module code" = e."Module code") 
group by m."Module name" 
order by count(*) desc, m."Module name"; 
2

インラインビューを使用してカウントを取得し、次にそれを順序付けることができます。

これは、かなりデータベースに依存しないはずです。

SELECT M.moduleCode, M.Modulename, B.cnt 
FROM Module M 
INNER JOIN (Select count(1) cnt, ModuleCode from exam group by ModuleCode) B 
    on M.ModuleCode= B.ModuleCode 
ORDER BY B.Cnt Desc 
+0

このクエリはうまくいきます!あなたはなぜ私に説明することができますか?それは本当に私の理解に役立つでしょう:) –

+0

lukStormsの答えは簡単で正確です。私はモジュールコードごとにグループ分けされた各試験の数を取得して、注文に戻ってきました。 LueStormsの答えはサブクエリを避ける – xQbert

1

を行う必要がありますによって&順序でグループに参加するには、別のものであると私はロジックを説明します:

SELECT module.name 
FROM module 
INNER JOIN exam ON module.module_code = exam.module_code 
GROUP BY module.name 
ORDER BY COUNT(*) DESC 

選択したいです最初の行に入るようにモジュール名。次に、名前を見つける場所を指定します。このクエリでは、両方に関連する情報があるため、モジュールと試験テーブルを結合したいと考えています。モジュールコードフィールドを使用してそれらを結合することができます。

この時点で、結合されたテーブルは試験テーブルとまったく同じように見えますが、モジュール名(およびモジュールテーブルの別のモジュールコード列)も含まれています。 group by文は、指定したフィールド(この場合はモジュール名)に基づいてテーブルを圧縮します。 COUNT(*)関数は、各名前に関連付けられたレコードの数をカウントし、それに基づいてORDERできます。