Stefan: Brauche Hilfe bei SQL Statement

hallo Zusammen!

Ich arbeite mit Oracle 9

Ich möchte die FIliale mit dem höchsten Umsatz auslesen... Im momment bin ich aber nur so wiet, dass mir Alle Filialen angezeigt werden mit dem tataliserten Umsatz...:

select FILNR2, sum(U_VP_N) from AVBUDRS where
          GJAHR = 2005 and RSNR = 1 group by FILNR2

Wie muss ich dieses Statement erweitern das mit NUR der höchste Wert angezeigt wird?

select FILNR2, max(sum(U_VP_N)) from AVBUDRS where
          GJAHR = 2005 and RSNR = 1 group by FILNR2

das funktioniert leider nicht....!!

gruss stefan

  1. Hallo Freunde des gehobenen Forumsgenusses,

    Ich möchte die FIliale mit dem höchsten Umsatz auslesen... Im momment bin ich aber nur so wiet, dass mir Alle Filialen angezeigt werden mit dem tataliserten Umsatz...:

    select FILNR2, sum(U_VP_N) from AVBUDRS where
              GJAHR = 2005 and RSNR = 1 group by FILNR2

    Wie muss ich dieses Statement erweitern das mit NUR der höchste Wert angezeigt wird?

    Du möchtest uns mitteilen, welche Spalten deine Tabelle hat (via describe table_name; o.ä.).
    Prinzipiell geht das in SQL (ich kenn nur MySQL) etwa so: select [...] order by umsatz desc limit 1;

    Gruß
    Alexander Brock

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Also die Tabelle hat folgende relevanten Felder:

      FILNR2    key
      GJAHR     key
      PERIODE   key
      RSNR      key
      U_VP_N

      jetzt möchte ich den höchsten U_VP_N eines Geschäftsjahr und einer RSNR über alle Filialen gesehen ermitteln...! U_VP_N muss summiert sein(PERIDOE)!

      gruss stefan

      1. Hallo Freunde des gehobenen Forumsgenusses,

        FILNR2    key
        GJAHR     key
        PERIODE   key
        RSNR      key
        U_VP_N

        jetzt möchte ich den höchsten U_VP_N eines Geschäftsjahr und einer RSNR über alle Filialen gesehen ermitteln...! U_VP_N muss summiert sein(PERIDOE)!

        Bewirkt folgendes Statement das, was du willst?

        select FILNR2, sum(U_VP_N) from AVBUDRS where  
                  GJAHR = 2005 and RSNR = 1 order by sum(U_VP_N) desc limit 1;
        

        Wenn nicht, könntest du einen SQL-Dump von einem Beispiel-Datensatz mit ~10 Werten zeigen?

        Gruß
        Alexander Brock

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. yo,

          select FILNR2, sum(U_VP_N) from AVBUDRS where

          GJAHR = 2005 and RSNR = 1 order by sum(U_VP_N) desc limit 1;

            
          meistens aber nicht immer ist das dbms mysql. und in diesem falle erinner ich mich dunkel etwas von oracle 9 gelesen zu haben.....  
            
          Ilja
          
          1. Hallo Freunde des gehobenen Forumsgenusses,

            meistens aber nicht immer ist das dbms mysql. und in diesem falle erinner ich mich dunkel etwas von oracle 9 gelesen zu haben.....

            Im Ausgangsposting schreibt Stephan, dass er Oracle 9 verwendet,
            ich kenne aber nur MySQL und ging davon aus, dass so grundlegende
            Sachen wie order by und limit in Oracle Entsprechungen haben.

            Gruß
            Alexander Brock

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. Hallo Alexander,

              Im Ausgangsposting schreibt Stephan, dass er Oracle 9 verwendet,
              ich kenne aber nur MySQL und ging davon aus, dass so grundlegende
              Sachen wie order by und limit in Oracle Entsprechungen haben.

              ich kenne auch MySQL und ging früher mal davon aus, dass so grundlegende Sachen wie ein Syntaxfehler bei Verwendung von nichtgruppierten und nichtaggregierten Spalten bei Verwendung von GROUP BY in MySQL eine Entsprechung hätte ... *SCNR*

              Fast jeden Tag lerne ich etwas Neues über die verschiedenen DBMS-Systeme und die von diesen unterstützte SQL-Syntax dazu. Du glaubst es gar nicht, wieviel Zeit es mich gekostet hat, ganz einfache SQL-Statements, die MySQL und MS SQL-Server anstandslos geschluckt haben, auch unter Oracle, DB2 und PostgreSQL (die mir allesamt nicht vertraut sind) zur fehlerfreien Ausführung zu bringen.

              Freundliche Grüße

              Vinzenz

            2. yo,

              ich kenne aber nur MySQL und ging davon aus, dass so grundlegende
              Sachen wie order by und limit in Oracle Entsprechungen haben.

              ORDER BY ja, LIMIT nein, auch wenn Oracle das mal implementieren sollte.

              Ilja

      2. hab die lösung gefunden...!

        select max(vp),max(ep) from (select FILNR2, sum(U_VP_N) vp,sum(A_EP) ep from AVBUDRS where GJAHR = 2005 and RSNR = 1 group by FILNR2)

        Gruss Stefan

    2. Hallo Alexander,

      Prinzipiell geht das in SQL (ich kenn nur MySQL) etwa so: select [...] order by umsatz desc limit 1;

      LIMIT ist eine komfortable Erweiterung von MySQL, die in anderen SQL-Dialekten nicht unbedingt üblich ist. PostgreSQL bietet sie meines Wissens und unter MS SQL Server könntest Du in Deinem Statement LIMIT durch TOP ersetzen. Oracle 9 hat keine vergleichbare Funktionalität, siehe z.B. http://dev.mysql.com/tech-resources/crash-me.php?res_id=58.

      Dedlfix hat in einem Archivposting die PEAR_DB-Lösung für dieses Problem verlinkt.

      Freundliche Grüße

      Vinzenz

      1. Hi,

        imho bietet Oracle mit "rownum" etwas gleichwertiges, zmd konnte man es
        in Oracle 7.3.4 und 8i verwenden um die Ergebnisrückgabemenge zu beein-
        flussen. Ich glaube nicht, dass Oracle solch eine Funktion einfach raus-
        wirft.

        Ciao, Frank

        1. Hallo Frank,

          imho bietet Oracle mit "rownum" etwas gleichwertiges, zmd konnte man es
          in Oracle 7.3.4 und 8i verwenden um die Ergebnisrückgabemenge zu beein-
          flussen. Ich glaube nicht, dass Oracle solch eine Funktion einfach raus-
          wirft.

          soweit ich weiß, ist in der von dedlfix verlinkten PEAR_DB-Lösung genau diese Funktion dafür verwendet worden. Ich habs mit meiner fast noch nagelneuen Oracle XE 10 durchgetestet, ROWNUM ist noch vorhanden :-)

          Ich gebe es zu, ich habe es mir mit der Vergleichstabelle von MySQL, die ich verlinkt habe, viel zu einfach gemacht. ROWNUM bietet auf jeden Fall mindestens die gleiche Funktionalität wie LIMIT.

          Freundliche Grüße

          Vinzenz

          1. yo,

            ROWNUM bietet auf jeden Fall mindestens die gleiche Funktionalität wie LIMIT.

            jein, ROWNUM ist sicherlich ein weg, um eine ähnliche funktionalität wie LIMIT zu haben. aber es gibt fallstricke mit ROWNUM, die man sich bewußt machen sollte, sprich ganz so einfach wie mit LIMIT ist die handhabung mit ROWNUM nicht, beispiel:

            SELECT vorname, nachname FROM tabelle ORDERY BY nachname LIMTI 2,1

            gibt nur den dritten datensatz zurück. (hoffe mysql fängt bei 0 an). das gleiche in Oracle kann einen fallstrick sein.

            SELECT vorname, nachname FROM tabelle WHERE ROWNUM = 3 ORDER BY nachname

            wird nämlich 0 datensätze zurückliefern. deswegen muss man die abfrage erst einmal als Tabelle ausgeben lassen.

            Ilja

            1. Hallo Ilja,

              SELECT vorname, nachname FROM tabelle WHERE ROWNUM = 3 ORDER BY nachname

              wird nämlich 0 datensätze zurückliefern. deswegen muss man die abfrage erst einmal als Tabelle ausgeben lassen.

              ja klar, es werden die ausgegebenen Datensätze numeriert :-)

              Freundliche Grüße

              Vinzenz

            2. von der funktionalität ist rownum etwas ganz anderes. aber mit entsprechendem einsatz läßt sich damit richtig zaubern.
              um das gleiche wie limit zu erhalten, also offset,anzahl, muß mit rownum ein subselect erstellt werden, welcher rownum als spalte liefert, welche dann in der where klausel auf die gewünschten ergebniszeilen beschränkt wird.

              1. yo,

                um das gleiche wie limit zu erhalten, also offset,anzahl, muß mit rownum ein subselect erstellt werden, welcher rownum als spalte liefert, welche dann in der where klausel auf die gewünschten ergebniszeilen beschränkt wird.

                hättest du das "deswegen muss man die abfrage erst einmal als Tabelle ausgeben lassen." gelesen, wäre dir aufgefallen, dass der hinweis schon erbracht wurde.

                Ilja

                1. der 'hinweis' ist nicht eindeutig und eher mißverständlich:
                  'erst als tabelle ausgeben' bedeutet nicht, daß die WHERE klausel aus einem subselect besteht.
                  wenn du dies 'hinweisen' wolltest, solltest du diese paar worte nicht sparen, sondern auch explizit erwähnen.

                  1. yo,

                    der 'hinweis' ist nicht eindeutig und eher mißverständlich:
                    'erst als tabelle ausgeben' bedeutet nicht, daß die WHERE klausel aus einem subselect besteht.
                    wenn du dies 'hinweisen' wolltest, solltest du diese paar worte nicht sparen, sondern auch explizit erwähnen.

                    die WHERE klausel besteht auch nicht aus einem subselect, dass habe ich nicht gemeint und auch nicht geschrieben. der subselect gibt eine tabelle wieder, steht also in der FROM klausel und so sollte es auch gemacht werden.

                    Ilja

                    1. zeig doch einfach deinen 'workaround' für oracle, welche das limit aus mysql ermöglicht. das was du bisher gezeigt hast, wars wohl net.

                      1. yo,

                        zeig doch einfach deinen 'workaround' für oracle, welche das limit aus mysql ermöglicht. das was du bisher gezeigt hast, wars wohl net.

                        mit keinen wort habe ich gesagt, dass unter oracle ein gleiche funktionalität wie LIMIT unter mysql zu erreichen ist, würde mich freuen, wenn oracle das mal umsetzen würde. und nur um dein persönlichen kleinkrieg zu befriedigen poste ich hier keine sql-anweisung, wie man eine query als tabelle ausgibt, damit man mit rownum arbeiten kann. wenn es dich interessiert, google wird einiges dafür ausspucken.

                        Ilja