Группировать с помощью столбца выбора. Я не могу войти в группу по предложению - PullRequest
1 голос
/ 27 апреля 2020

Я написал запрос SQL Сервер, который выбирает first_name из таблицы клиентов, а затем оценивает из таблицы студентов. Он отлично работает без выражения CASE и отлично работает с MySQL, однако на SQL сервере я, кажется, продолжаю сталкиваться со следующей проблемой:

Msg 8120, уровень 16, состояние 1, строка 81 Столбец «apers.grade »недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

Я действительно не знаю, почему это проблема, и единственное решение, которое я нашел, это включение его в группу как "GROUP BY first_name, grade". это однако изменяет мой вывод и поэтому не может быть использовано. Может ли кто-нибудь объяснить мне, почему эта ошибка продолжает происходить? Это будет высоко ценится.

Мой sql запрос

SELECT 
    first_name, 
    AVG(ISNULL(grade, 0)) AS average, 
    CASE    
        WHEN grade < 75 THEN'failing' 
        ELSE'passing' ENDAS result 
    FROM students 
    LEFT JOIN papers 
        ON papers.student_Id = students.id
        GROUP BY first_name
        ORDER BY average DESC

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Ваш запрос не выполнен, поскольку в выражении case (grade) имеется неагрегированный столбец, который не принадлежит предложению group by. В большинстве баз данных это фатальная ошибка - хотя MySQL слабо относится к этому, что может привести к удивительному поведению.

Скорее всего, вы хотите:

SELECT 
    s.first_name, 
    AVG(ISNULL(p.grade, 0)) AS average, 
    CASE WHEN AVG(ISNULL(p.grade, 0)) < 75 THEN 'failing' ELSE 'passing' END result 
FROM students s
LEFT JOIN papers p ON p.student_Id = s.id
GROUP BY s.id, s.first_name
ORDER BY average DESC

Это устанавливает result в соответствии со средним значением grade каждого student.

Обратите внимание, что я добавил псевдонимы таблиц в ваш запрос и добавил к каждому столбцу префикс таблицы, к которой он принадлежит; это делает запрос более легким для чтения и записи, и однозначно относится к базовой структуре таблиц.

Примечание: я довольно подозрительно отношусь к конструкции ISNULL() в статистической функции AVG(); AVG() игнорируйте значения NULL s, поэтому ваше выражение заставляет учащихся без оценок получить среднее значение 0 вместо NULL - что может не соответствовать вашим ожиданиям.

0 голосов
/ 27 апреля 2020

Я думаю, вам нужно сгруппировать по всему вашему выражению CASE.

SELECT 
first_name, 
AVG(ISNULL(grade, 0)) AS average, 
CASE    
    WHEN grade < 75 THEN
        'failing' 
    ELSE
        'passing' 
END AS result 
FROM students 
LEFT JOIN papers 
    ON papers.student_Id = students.id
GROUP BY 
    first_name,
    CASE    
        WHEN grade < 75 THEN
            'failing' 
        ELSE
            'passing' 
    END
ORDER BY average DESC

Это должно избавить от ошибки. Тем не менее, это, возможно, не то, что вы ищете.

...