У меня проблема SQL, работающая в Teradata. У меня есть 2 таблицы, называемые Class, Table 1 и Grades, Table 2. Из таблицы 1 я хочу извлечь определенную группу студентов из определенного класса, Year 1 и т.д. И показать некоторые дополнительные данные. К данным из таблицы 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 возникает после того, как произошло соединение, поэтому вы не видите всех учеников.
ваш запрос использует 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';
Для части, показывающей имена вместо идентификаторов для объекта, вы должны ввести другое соединение в запросе
FROM Table1 a LEFT JOIN Table2 b ON a.name=b.name AND b.subject in ('2') WHERE a.group in ('1')
таблицыFROM Table1 a LEFT JOIN Table2 b ON a.name=b.name AND b.subject in ('2') WHERE a.group in ('1')
См. info.teradata.com/HTMLPubs/DB_TTU_16_00/SQL_Reference/…