2017-11-21 6 views
0

私は、特定のクラスに属するすべての生徒記録を保存するテーブルを用意しています。 JOINを使用してこの出力を取得する方法

Class_ID|StudentID|Class_FEE 
---------------------------- 
1001 | 0  | 100 
1001 | 101 | 50 

は、彼らが最初のテーブルの上に0

ClassID | StudentID 
--------|----------- 
1001 | 100 
1001 | 101 

今、特定のクラスに登録しながら、今、別のテーブルには、生徒データを保存(100101ここでは)すべての学生を示しています。今では両方とも100の手数料を持っていますが、何らかの目的で101が50を持っています

私はあなたが行うことができます

ClassID | StudentID | Amount 
--------|-------------|-------- 
1001 | 100  |100 
1001 | 101  | 50 (here 50 <100 so taking 50) 
+0

私は0はクラス1001に登録したすべての学生を意味すると言っています。 – Babai

答えて

0

あなたはそれぞれの学生に属する最低料金について興味を持っている場合は、あなただけ行うことができ、この

select r.classid , r.studentid, min(b.Class_FEE) 
from registered r 
join belongs b on b.classid = r.classid and 
       (b.studentid = r.studentid or 0 = b.studentid) 
group by r.classid , r.studentid 

demo

結果

ClassID StudentID Amount 
------------------------------------- 
1001 100   100 
1001 101   50 
+0

ありがとう、それは働いた! :) – Babai

+0

@Babaiあなたはウェルカムです:) –

0

のようにAO/Pが必要になります。

select sc.studentid, 
     (case when f.fee < f0.fee then f.fee else f0.fee end) as fee 
from studentclass sc left join 
    fees f 
    on sc.studentid = f.studentid and sc.classid = f.classid left join 
    fees f0 
    on sc.classid = f0.classid and f0.studentid = 0; 

このバージョンでは、学生/クラスの組み合わせは一度だけで表示されていることを(あなたのサンプルデータのように)を前提としてい料金表。

+0

私はそれが正しくないと信じています:http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=ef1e120cec9c8df549e9ae46b59b42f7 –

+0

@RadimBača。 。 。良いキャッチ。手数料を加えることは、最小限のものよりも私には意味がありますが、後者は、オペラが求めているものです。 –

0

を使用することができます。

DECLARE @particularclass TABLE (Class_ID int, StudentID int, Class_FEE int) 
DECLARE @regclass TABLE (ClassID int, StudentID int) 
INSERT INTO @particularclass VALUES (1001,0,100), (1001,101,50) 
INSERT INTO @regclass VALUES (1001,100), (1001,101) 

SELECT R.* 
     ,COALESCE((SELECT MIN(Class_FEE) FROM @particularclass P WHERE P.StudentID = R.StudentID) 
       ,(SELECT CLass_FEE FROM @particularclass P WHERE P.StudentID = 0)) AS [Amount] 
    FROM @regclass R 
関連する問題