2017-08-16 17 views
-1

サブクエリから受け取ったカウントに料金の金額を掛けるためのクエリを書いていますが、その方法はわかりません。助け/提案? Oracleのクエリは次のとおりです。算術演算を行うために複数の行の結果を使用

select courseid,coursename,fees*tmp 
from course c join registration r on 
r.courseid=c.courseid 
and tmp IN (select count(*) 
from course c join registration r on 
r.courseid=c.courseid group by coursename); 

私は、変数tmpのように使用してみましたが、私はそれは、Oracleのクエリで動作しないと思います。それに代わる方法がありますか?

答えて

2

FROMとWHEREの間に表示されているテーブルのデータのみを選択できるので、これを行うことはできません。 IN演算子は、一連のOR文を書く必要がなくなりますが、外部クエリに変数を設定できるものではありません。

select courseid,coursename,fees * COUNT(r.courseID) OVER(PARTITION BY c.coursename) 
from course c join registration r on 
r.courseid=c.courseid 

編集/更新:

代わりのような何かを、あなたは、このクエリがあまりにも多くの行を生成することを指摘し、あなただけの個別のコース名を表示したいです。その場合、ちょうどコースで人々の数をカウントして、手数料を乗算する登録テーブルを使用する方が良いでしょう:

SELECT 
    c.courseid, c.coursename, c.fees * COALESCE(r.numberOfstudents, 0) as courseWorth 
FROM 
    course c 
    LEFT OUTER JOIN 
    (select courseid, COUNT(*) as numberofstudents FROM registration GROUP BY courseid) r 
    ON c.courseID = r.courseid 
+0

それは動作します。しかし、複数の同じコース名があるとしましょうが、私は別個の名前の行がほしいと思います。どのように達成できますか? –

+0

これはもっと古典的なグループクエリです。私は例を含めるために私の答えを編集します –

+0

私は助けを求めている私は不平を言う権利がありません。ちょうど私が探していたものです。ありがとうございました。 –

1

あなたはキーズのようなウィンドウ関数を使用することができますかあなたのような結合を使用することができますこの:

select courseid,coursename, fees * COALESCE(sub.cnt,0) 
from course c 
join registration r on r.courseid=c.courseid 
left join (
    select coursename, count(*) as cnt 
    from course c2 
    join registration r2 on r2.courseid=c2.courseid 
    group by coursename 
) as sub; 

注:私はあなたが加入ノークレームが正しいん作る - 私はあなたのデータモデルのいずれかの知識にないあなたの例のオフに、このクエリを基づかよ。

+0

私は1つのことを忘れました - メインクエリの内側と外側の両方でエイリアスのためのrとcの再利用。 oracleは、サブクエリが調整されているかどうかを混乱させるでしょうか? –

+0

@CaiusJardがエラーを起こす可能性があります。 – Hogan

+0

それはうまく動作します、それはちょうど私が算術演算を行うことができませんでした。 –

関連する問題