Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle:НЕ Е ГРЕШКА В ИЗРАЗА НА ГРУПА

Опитайте:

SELECT c.courseid,
       c.coursename,
       AVG(a.mark) AS Average_Mark
FROM   COURSE c
       INNER JOIN ASSESSMENT a
               ON c.courseid = a.courseid
GROUP  BY c.courseid,
          c.coursename
ORDER  BY 3 DESC; -- or ORDER BY Average_Mark DESC

Докато събирате няколко стойности на Mark за да се изчисли средната стойност, става невъзможно сортирането по всяка стойност на Mark . Трябва да сортирате по резултата от изчислението, т.е. Average_Mark .

От по-обща гледна точка имате право да ORDER BY не SELECT ed колона само ако тази колона е част от заявените таблици и ако не използвате GROUP BY или DISTINCT (освен ако не GROUP BY тази непоказана колона, тогава можете да ORDER BY то).

Причината е проста:ако използвате GROUP BY или DISTINCT , няколко реда потенциално ще бъдат показани като един. Непоказаните стойности в тези „обединени“ редове могат потенциално да се различават една от друга, правейки всеки ORDER BY невъзможно за тези стойности.

Някои СУБД (поне MySQL) се държат по различен начин, позволявайки ORDER ing BY непоказани стойности, дори и с GROUP BY . Но MySQL изглежда след това подрежда по първата срещана стойност на непоказана стойност (вижте цигулка ). Така че по-добре имайте предвид, че това трябва да се избягва, за да предотвратите непредвидими резултати.

РЕДАКТИРАНЕ: Вижте документацията относно MySQL GROUP BY обработка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намерите колоната, използвана в динамичната заявка, без да изпълнявате цялата заявка

  2. вземете интервали с непроменлива стойност от поредица от числа

  3. Копиране на ред и промяна на малка част от колони?

  4. ORA-12170:TNS:Възникна изчакване на връзката

  5. Защо Oracle.ManagedDataAccess не работи, когато Oracle.DataAccess го прави?