Запрос для получения студентов и оценки SQL

0

У меня есть студенческая таблица Student (LRN, fName, lName, levelID) и таблица классов GRADE (subjectID, grade, levelID, LRN, TimeAdded). Я хочу показать всем учащимся все предметы с оценками в режиме онлайн. Я устал от этого запроса, но получил эти результаты.

Query: SELECT student.LRN, student.fName, student.lName, 
(SELECT grade.grade WHERE grade.subjectID = 'k2arts') AS 'k2arts',
(SELECT grade.grade WHERE grade.subjectID = 'k2math') AS 'k2math',
(SELECT grade.grade WHERE grade.subjectID = 'k2eng') AS 'k2eng',
(SELECT grade.grade WHERE grade.subjectID = 'k2valed') AS 'k2valed',
(SELECT grade.grade WHERE grade.subjectID = 'k2fil') AS 'k2fil' 
from student RIGHT JOIN grade on grade.LRN=student.LRN 

Результаты: Результат запроса

Теги:

3 ответа

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

Вы хотите установить отношение СТУДЕНТА в каждом подзапросе. Вам не нужно вступать в Grade в основной запрос, так как вы не используете какие-либо его значения, кроме как в виде подзапросов, которые в этом случае не связаны между собой:

SELECT student.LRN, student.fName, student.lName, 
(SELECT grade.grade FROM grade WHERE grade.subjectID = 'k2arts' AND grade.LRN=st.LRN) AS 'k2arts',
(SELECT grade.grade FROM grade WHERE grade.subjectID = 'k2math' AND grade.LRN=st.LRN) AS 'k2math',
(SELECT grade.grade FROM grade WHERE grade.subjectID = 'k2eng' AND grade.LRN=st.LRN) AS 'k2eng',
(SELECT grade.grade FROM grade WHERE grade.subjectID = 'k2valed' AND grade.LRN=st.LRN) AS 'k2valed',
(SELECT grade.grade FROM grade WHERE grade.subjectID = 'k2fil' AND grade.LRN=st.LRN) AS 'k2fil' 
from student st 
  • 0
    Знаете ли вы, почему я получаю «Неизвестный столбец grade.grade в списке полей»?
  • 0
    Да. Потому что вы пропустили предложение FROM в своих подзапросах (как и я). Я обновил свой ответ. Обдумайте ответ @ ScaisEdge ниже, так как для этого требуется только одно соединение и своего рода ложное агрегирование (фальшивое, потому что на самом деле ничего не агрегируется, но это приведет к выводу одной записи вместо 5 для каждой LRN), вероятно, это будет более эффективным.
Показать ещё 1 комментарий
0

Пытаться:

SELECT student.LRN, student.fName, student.lName, 
CASE WHEN grade.subjectID = 'k2arts' THEN grade.grade END AS 'k2arts',
CASE WHEN grade.subjectID = 'k2math'  THEN grade.grade END AS 'k2math',
CASE WHEN grade.subjectID = 'k2eng'   THEN grade.grade END AS 'k2eng',
CASE WHEN grade.subjectID = 'k2valed' THEN grade.grade END AS 'k2valed',
CASE WHEN grade.subjectID = 'k2fil'   THEN grade.grade END AS 'k2fil' 
from student 
LEFT JOIN grade 
on grade.LRN=student.LRN ;
0

Вы можете использовать левое соединение и случай, когда

SELECT student.LRN, student.fName, student.lName, 
  case when grade.subjectID = 'k2arts' then grade.grade else null end AS 'k2arts',
  case when grade.subjectID = 'k2math' then grade.grade else null end AS 'k2math',
  case when grade.subjectID = 'k2eng' then grade.grade else null end AS 'k2eng',
  case when grade.subjectID = 'k2valed' then grade.grade else null end AS 'k2valed',
  case when grade.subjectID = 'k2fil' then grade.grade else null end AS 'k2fil'
from student 
LEFT JOIN grade on grade.LRN=student.LRN 

и в конечном итоге использовать фальшивую функцию агрегации для удаления null

SELECT student.LRN, student.fName, student.lName, 
  min(case when grade.subjectID = 'k2arts' then grade.grade else null end) AS 'k2arts',
  min(case when grade.subjectID = 'k2math' then grade.grade else null end) AS 'k2math',
  min(case when grade.subjectID = 'k2eng' then grade.grade else null end) AS 'k2eng',
  min(case when grade.subjectID = 'k2valed' then grade.grade else null end) AS 'k2valed',
  min(case when grade.subjectID = 'k2fil' then grade.grade else null end) AS 'k2fil'
from student  student.LRN, student.fName, student.lName
LEFT JOIN grade on grade.LRN=student.LRN 
group by 
  • 0
    При попытке запроса я получаю сообщение об ошибке, которая не распознается
  • 0
    В нем отсутствует ключевое слово THEN .
Показать ещё 2 комментария

Ещё вопросы

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