Запрос с присоединением и расчетом - PullRequest
0 голосов
/ 22 ноября 2018

Мне нужно создать запрос, основанный на следующем вопросе:

Мне нужно добавить количество преподавателей и студентов с одинаковым почтовым индексом, и если оно больше 10, перечислите город, штат,общее количество преподавателей, общее количество студентов и общее количество добавленных преподавателей и студентов вместе.Все три таблицы имеют поле zip, которое они разделяют.Это первичный ключ в таблице почтовых индексов и внешний ключ в таблице инструктора и ученика.Поля города и штата находятся в таблице почтовых индексов.У меня изначально был этот запрос, но строки не возвращались.Я не могу получить общее количество.Каждый раз, когда я включаю либо SUM, либо дополнение, я получаю ORA 00923 От ключевого слова не найдено, где ожидаемая ошибка.

select city, state, 'TOTAL'
from zipcode
left join
(select student.zip, count(*) 'Total_Stud'
from student
group by zip)
s on zipcode.zip=student.zip
left join
(select instructor.zip, count(*) 'Total_Inst'
from instructor
group by zip)
i on zipcode.zip=instructor.zip
where count(student.student_id) + count(instructor.instructor_id)>=10 as total
order by total desc;

В нем участвуют 3 таблицы Student Table, инструктор и почтовый индекс

1 Ответ

0 голосов
/ 22 ноября 2018

Я думаю, вы были достаточно близки, но когда вы используете подзапросы, используйте псевдонимы подзапроса и имена / псевдонимы столбцов, предоставленные подзапросом.Например, вы можете использовать псевдоним s.Total_Stud в последнем предложении where.Вы не можете напрямую ссылаться на таблицу ученика в предложении where, потому что она доступна только внутри подзапроса, известного как s.Это можно назвать «областью действия» подзапроса, который я попытался определить ниже.

select zipcode.city, zipcode.state, (NVL(s.Total_Stud,0) + NVL(i.Total_Inst,0)) TOTAL
from zipcode 
left join (
    -- -------------- scope ------------------- -- student 
    select student.zip, count(*) Total_Stud     -- student 
    from student                                -- student 
    group by zip                                -- student 
    -- -------------- scope ------------------- -- student 
    ) s on zipcode.zip=s.zip
left join (
    -- ------------- scope -------------------- -- instructor 
    select instructor.zip, count(*) Total_Inst  -- instructor 
    from instructor                             -- instructor 
    group by zip                                -- instructor 
    -- ------------ scope --------------------- -- instructor 
    ) 
    i on zipcode.zip=i.zip
where (NVL(s.Total_Stud,0) + NVL(i.Total_Inst,0)) >=10
order by (NVL(s.Total_Stud,0) + NVL(i.Total_Inst,0)) desc, zipcode.city;

Обратите внимание, что, поскольку каждый left join может привести к несогласованным строкам (например, город без студентов), токоличество студентов или преподавателей может отсутствовать, поэтому при их сложении мы должны избегать NULL, поэтому я использовал функцию NVL() для замены NULL на ноль.COALESCE() можно использовать вместо NVL()

Наконец, также обратите внимание, что в Oracle вы хотите избегать использования заключенных в кавычки имен / псевдонимов, если вы сделаете это, они станут "чувствительными к регистру" и это будет очень болезненноиспользовать.(Таким образом, это также означает, что нужно избегать пробелов в именах / псевдонимах столбцов.)

Для демонстрации см. db <> fiddle здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...