从 Table 1 中删除部分并显示 Table 2 的部分
Taking away part from Table 1 and showing parts of Table 2
我有一个 SQL 问题,在 Teradata 上工作。
我有 2 个表,分别称为 Class、Table 1 和成绩 Table 2。
来自 Table 1 我想从特定的 Class、一年级等中提取特定的一组学生并显示一些额外的数据。
对于来自 Table 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')
;
您的查询正在使用 IN,但您不需要它。如下修复 WHERE 部分,看看它是否按预期工作:
SELECT
a.Name
a.Age
b.Subject
b.grade
FROM Table1 a
LEFT JOIN Table2 b ON a.name=b.name
WHERE a.group='1'
AND b.subject='2';
对于关于显示名称而不是主题 ID 的部分,您必须在查询中引入另一个连接
您需要创建一个单独的 table 主题,然后加入 Subject/ID。这样您就可以用名称替换数字。或者你可以使用 IF(b.subject = 1,'English',IF(b.subject = 2,'History',IF(b.subject = 3,'Science')))
但这不是很合适 table 对于很多主题。
WHERE
位是您的问题。你需要把它放在 LEFT JOIN 上,这样你的查询就会像这样:
ON a.name = b.name AND subject = 2
试试看...
通过限制 JOIN,您仍然 return 其他行 - WHERE 发生在连接发生之后,因此您看不到所有学生。
我有一个 SQL 问题,在 Teradata 上工作。 我有 2 个表,分别称为 Class、Table 1 和成绩 Table 2。 来自 Table 1 我想从特定的 Class、一年级等中提取特定的一组学生并显示一些额外的数据。 对于来自 Table 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')
;
您的查询正在使用 IN,但您不需要它。如下修复 WHERE 部分,看看它是否按预期工作:
SELECT
a.Name
a.Age
b.Subject
b.grade
FROM Table1 a
LEFT JOIN Table2 b ON a.name=b.name
WHERE a.group='1'
AND b.subject='2';
对于关于显示名称而不是主题 ID 的部分,您必须在查询中引入另一个连接
您需要创建一个单独的 table 主题,然后加入 Subject/ID。这样您就可以用名称替换数字。或者你可以使用 IF(b.subject = 1,'English',IF(b.subject = 2,'History',IF(b.subject = 3,'Science')))
但这不是很合适 table 对于很多主题。
WHERE
位是您的问题。你需要把它放在 LEFT JOIN 上,这样你的查询就会像这样:
ON a.name = b.name AND subject = 2
试试看...
通过限制 JOIN,您仍然 return 其他行 - WHERE 发生在连接发生之后,因此您看不到所有学生。