我在 Teradata 上工作时遇到 SQL 问题。 我有 2 张表,分别称为类(class)(表 1)和成绩(表 2)。 从表 1 中,我想从特定类(class)、一年级等中提取一组特定的学生,并显示一些附加数据。 对于表 1 中的数据,我想添加特定科目的成绩,但并非所有学生都选修该科目,对于他们,我希望得到 NULL 结果。
我知道如何仅获取参加该科目的学生的数据,但我却错过了其他学生。
SELECT
a.Name
a.Age
b.Subject
b.grade
FROM Table1 a
LEFT JOIN Table2 b ON a.name=b.name
WHERE a.group in ('1')
AND b.subject in ('2')
;
另外,我知道科目 1=英语,2=历史,3=数学,所以我希望将数字切换为实际姓名。
部分数据:
Table1 Table2
Group Name Age Name Subject Grade
1 Anna 12 Anna 1 A
1 Bengt 11 Anna 2 B
1 Cesar 12 Bengt 1 A
2 David 12 Bengt 2 A
2 Eric 13 Bengt 3 C
2 Filip 12 Cesar 1 C
3 Gustav 14 Cesar 3 C
3 Hugo 14 Cesar 4 B
3 Inga 14 Cesar 5 A
我得到了什么:
Name Age Subject Grade
Anna 12 2 B
Bengt 11 2 A
我想要什么:
Name Age Subject Grade
Anna 12 History B
Bengt 11 History A
Cesar 12
拜托,谁能帮帮我。
最终 SQL
SELECT
DISTINCT(a.Name)
a.Age
(CASE When b.scan_type_cd in ('2') then 'History' else NULL END) AS History,
b.grade
FROM Table1 a
LEFT JOIN Table2 b ON a.name=b.name AND b.scan_type_cd in ('2')
WHERE a.group in ('1')
;
最佳答案
您需要创建一个名为“主题”的单独表,然后加入“主题/ID”。这样您就可以用名称替换数字。或者您可以使用IF(b.subject = 1,'English',IF(b.subject = 2,'History',IF(b.subject = 3,'Science')))
但这不太适合很多科目。
WHERE
位是你的问题。您需要将其放在 LEFT JOIN 上,以便您的查询将显示如下内容:
ON a.name = b.name AND subject = 2
尝试一下...
通过限制 JOIN,您仍然返回其他行 - WHERE 发生在连接发生之后,因此您看不到所有学生。
关于mysql - 去掉表 1 的部分并显示表 2 的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48318740/