Забирая часть из Таблицы 1 и показывая части Таблицы 2
У меня проблема с SQL, работаю в Teradata. У меня есть 2 таблицы, которые называются "Класс", "Таблица 1" и "Оценки", Таблица 2. Из таблицы 1 я хочу извлечь определенную группу учащихся из определенного класса, 1-го года и т. Д. И показать некоторые дополнительные данные. К данным из Таблицы 1 я хочу добавить оценки по конкретному предмету, но не все студенты выбирают этот предмет, и для них я хочу получить НУЛЕВЫЙ результат.
Я знаю, как получить данные только от тех студентов, которые изучают предмет, но я скучаю по другим студентам.
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')
;
2 ответа
Вам нужно будет создать отдельную таблицу с именем Subjects и затем присоединиться к Subject/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, вы по-прежнему возвращаете другие строки - ГДЕ происходит после того, как соединение произошло, поэтому вы не видите всех студентов.
Ваш запрос использует 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';
Для части об отображении имен вместо идентификаторов для субъекта вы должны ввести другое соединение в запросе