Забирая часть из Таблицы 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';

Для части об отображении имен вместо идентификаторов для субъекта вы должны ввести другое соединение в запросе

Другие вопросы по тегам