Удаление части из Таблицы 1 и отображение частей Таблицы 2

0

У меня проблема 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')
    ;
  • 1
    Существует простое правило для внешних объединений: условия на внешней таблице должны быть помещены в WHERE, а условия на внутренней таблице должны быть в ON: 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/…
Теги:
teradata

2 ответа

2
Лучший ответ

Вам нужно будет создать отдельную таблицу под названием "Субъекты", а затем присоединиться к теме /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 возникает после того, как произошло соединение, поэтому вы не видите всех учеников.

  • 0
    Часть IF, я думаю, будет работать, так как меня интересует только одна тема в то время. Переименуйте предметную часть из ГДЕ, тогда я получу всю тему. И меня интересует только то, как один предмет «влияет» на оценки в классе в то время. Оба ученика берут предмет и не берут предмет.
  • 0
    Ах - я думаю, что я вижу проблему .. пересматривая мой ответ
0

ваш запрос использует 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';

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

  • 0
    Спасибо, но это дает мне точно такой же результат. Я получаю только тех учеников, которые действительно изучают предмет, но скучают по тем ученикам, которые его не берут, и я хотел бы показать весь список классов.
  • 0
    попробуйте с правильным соединением
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню