sql >> Database >  >> RDS >> Oracle

Oracle:GEEN GROEP OP UITDRUKFOUT

Probeer:

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

Terwijl u verschillende waarden van Mark samenvoegt, om het gemiddelde te berekenen, wordt het onmogelijk om te sorteren op elke waarde van Mark . U moet sorteren op het resultaat van de berekening, d.w.z. Average_Mark .

Vanuit een meer algemeen oogpunt mag u ORDER BY een niet SELECT ed-kolom alleen als deze kolom deel uitmaakt van de opgevraagde tabellen en als u geen GROUP BY gebruikt of DISTINCT (tenzij je GROUP BY deze niet weergegeven kolom, dan kunt u ORDER BY het).

De reden is simpel:als u GROUP BY . gebruikt of DISTINCT , worden mogelijk meerdere rijen als één weergegeven. Niet weergegeven waarden in die "samengevoegde" rijen kunnen mogelijk van elkaar verschillen, waardoor elke ORDER BY onmogelijk op die waarden.

Sommige DBMS (minstens MySQL) gedragen zich anders, waardoor ORDER ing BY niet weergegeven waarden, zelfs met GROUP BY . Maar MySQL lijkt dan te sorteren op de eerst aangetroffen waarde van niet-weergegeven waarde (zie fiddle ). Houd er dus rekening mee dat dit moet worden vermeden om onvoorspelbare resultaten te voorkomen.

BEWERKEN: Zie de documentatie over MySQL GROUP BY behandeling.



  1. MYSQL:ALS OR-conditie en REGEXP overeenkomen

  2. Moet u de gegevenstypen MONEY of DECIMAL(x,y) in SQL Server kiezen?

  3. SQL Server Express versus express localdb

  4. CASESTUDY:ARKWARE MS ACCESS CRM