2016-10-25 6 views
0

Hier ist meine Frage:komplexe Abfrage mit max();

SELECT GENRE,MAX(COUNT(GENRE)) 
FROM BOOKS 
WHERE ID_BOOK IN(SELECT ID_BOOK 
       FROM SIGNATURES 
       WHERE SIGNATURE IN(SELECT SIGNATURE 
            FROM ORDERS 
            WHERE ID_READER=1)) 
GROUP BY GENRE; 

ich einen Fehler:

SQL Error: ORA-00937: not a single-group group function

Wenn ich GENRE löschen, die es funktioniert in Ordnung kurz nach SELECT bleibt aber nur die Nummer erzeugt. Ich muss auch wissen, welches spezifische GENRE den maximalen Wert hat.

EDIT:

select GENRE,CNT INTO var_genre, var_max from (
SELECT GENRE,COUNT(GENRE) as CNT FROM BOOKS 
WHERE ID_BOOK IN(SELECT ID_BOOK FROM SIGNATURES 
WHERE SIGNATURE IN(SELECT SIGNATURE FROM ORDERS WHERE ID_READER=1)) 
GROUP BY GENRE 
order by COUNT(GENRE) desc) 
where rownum < 2; 
+0

Wenn die 'MAX (COUNT (Genre))' innerhalb der höchsten Zählung muss Der gesamte Satz, Sie müssen nur hinzufügen, OVER() ', um das vollständige Fenster anzuzeigen. –

Antwort

0

Sie kann nicht in einer Abfrage Schlepptau Aggregationen tun. Sie sollten es in Unterabfrage tun:

select distinct GENRE,CNT from ( 
    select GENRE,CNT, DENSE_RANK() Over(prder by CNT) as rnk from (
    SELECT GENRE, 
      COUNT(GENRE) over (partition by GENRE) as CNT 
     FROM BOOKS 
    WHERE ID_BOOK IN(SELECT ID_BOOK 
         FROM SIGNATURES 
         WHERE SIGNATURE IN(SELECT SIGNATURE FROM ORDERS WHERE ID_READER=1)) 
) 
whre rnk = 1; 

Oder wenn Sie nur eine Zeile benötigen Sie es in subquery wickeln:

select GENRE,CNT from (
SELECT GENRE,COUNT(GENRE) as CNT FROM BOOKS 
WHERE ID_BOOK IN(SELECT ID_BOOK FROM SIGNATURES 
    WHERE SIGNATURE IN(SELECT SIGNATURE FROM ORDERS WHERE ID_READER=1)) 
GROUP BY GENRE 
order by COUNT(GENRE) desc) 
whre rownum < 2; 
+0

Vielen Dank, aber wenn ich versuche, diesen Code mit SQL Plus mit Änderung ausführen - wählen Sie GENRE, CNT INVAR1, var2 FROM ... Ich erhalte Fehler ORA-01403. Ist es möglich, dies von der SQL Plus-Ebene aus auszuführen? – monterinio

+0

Ihre Abfrage wird das gleiche Ergebnis in SQL plus und in jeder anderen IDE zurückgeben. ORA-01403 - es bedeutet No_data_found Abfrage keine Zeile zurückgeben –

+0

Nun, dieser Code funktioniert einwandfrei auf SQL Developer und gibt ein richtiges Ergebnis, aber auf SQL Plus sehe ich diesen Fehler und ich bin mir ziemlich sicher, dass Daten noch in der DB sind. – monterinio