如何使用JOIN获得此输出

时间:2017-11-21 13:43:09

标签: sql sql-server

我有一张桌子,用于存储属于特定班级的所有学生记录。

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

现在,另一个表存储了学生数据,而这些数据是在特定类

上注册的
ClassID | StudentID
--------|-----------
1001    |   100
1001    |   101

现在第一个表0表示所有学生(此处为100,101)。现在两人都收费100,但101出于某种目的得到了50。

我需要一个o / p之类的

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

3 个答案:

答案 0 :(得分:0)

你可以这样做:

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;

此版本假设(如您的样本数据中)学生/班级组合仅在费用表中出现一次。

答案 1 :(得分: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

答案 2 :(得分: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