Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Fehlende Aggregatfunktionen MAX

Dieses Thema im Forum "Oracle" wurde erstellt von AngstHab, 13 Mai 2014.

  1. AngstHab

    AngstHab Benutzer

    Hallo

    Ich habe gerade ein Projekt welches per PHP auf eine OracleDb 10 zugreift!
    Das ganze läuft über unixodbc und funktioniert auch recht gut.
    Hab nun das Problem, das ich eine Datetime-Spalte auslesen und nach dem Neusten Eintrag filtern muss.
    Leider ist das gar nicht so einfach, da scheinbar die Funktion max() fehlt!
    Ist das so oder gibt es eine andere Möglichkeit das ohne grössere DB-Belastung zu erreichen?
    Tante Google wurde schon seit knapp 2 Tagen dazu befragt, aber was brauchbares ist noch nicht heraus gekommen!

    mfg AngstHab
     
  2. ukulele

    ukulele Datenbank-Guru

  3. AngstHab

    AngstHab Benutzer

    Es geht gar nicht! Ich brauche die Ausgabe in einem "Left JOIN" um den neusten Buchungsstand erfassen zu können.
    Die Funktion geht nicht bei DateTime (TransactionDate/mehrere gleiche Datetime-Einträge_1:n) und PostingNo (siehe unten/1:1) ...

    SELECT ItemNo, TransactionDate, MAX(PostingNo) 'lastPostingNo'
    FROM joural

    Versteh ich nicht, sollte doch Standart SQL sein!

    mfg AngstHab
     
    Zuletzt bearbeitet: 14 Mai 2014
  4. Hubertus

    Hubertus Fleissiger Benutzer

    Da fehlt
    GROUP BY ItemNo, TransactionDate
     
  5. AngstHab

    AngstHab Benutzer

    Danke für die schnelle Antwort.

    Geb ich "SELECT ItemNo, TransactionDate, PostingNo FROM Journal" an, werden alle Daten fein per odbc_result angezeigt.
    Sobald ich MAX() rein bring "SELECT ItemNo, TransactionDate, (MAX)PostingNo 'maxPostingNo' FROM Journal GROUP BY ItemNo, TransactionDate" ist die Ausgabe leer!

    mfg AngstHab
     
  6. ukulele

    ukulele Datenbank-Guru

    Code:
    SELECT   ItemNo,
         TransactionDate,
         max(PostingNo) AS maxPostingNo
    FROM   Journal
    GROUP BY ItemNo,TransactionDate
    
     
  7. AngstHab

    AngstHab Benutzer

    odbc_exec(): SQL error: [unixODBC][Oracle][ODBC][Ora]ORA-00923: FROM keyword not found where expected\n, SQL state S1000 in SQLExec Dir execDirect
     
  8. AngstHab

    AngstHab Benutzer

    Das müsste doch eigentlich den gleichen Effect haben?

    LEFT JOIN ((SELECT ItemNo, TransactionDate, PostingNo
    FROM journal
    ORDER BY PostingNo DESC)
    WHERE ROWNUM <= 1 )
     
  9. ukulele

    ukulele Datenbank-Guru

    Deine SQL Syntax ist alles andere als Standard SQL und ich kann mir nicht vorstellen das das funktioniert. Wenn
    Code:
    SELECT ItemNo, TransactionDate, PostingNo FROM Journal
    geht, dann geht auch
    Code:
    SELECT ItemNo, TransactionDate, max(PostingNo) FROM Journal GROUP BY ItemNo, TransactionDate
    sofern es sich bei PostingNo um einen numerischen Datentypen handelt. Bei einem Journal scheint mir das aber wenig sinn zu machen wenn man nicht auch max(TransactionDate) oder soetwas wählt, das hängt aber stark von deinen Daten ab. Funktionieren muss es erstmal.
     
  10. AngstHab

    AngstHab Benutzer

    Die Eigenschaften der Spalten:
    ItemNo - 20 - tString - Uppercase - Not NULL
    TransactionDate - 8 - tDate
    PostingNo - 4 - tWord - Not NULL

    Ich hab die Datenbank direkt abgefragt:

    SELECT ItemNo, TransactionDate, PostingNo
    FROM Journal
    WHERE ItemNo = '2-175-000-300'
    ORDER BY PostingNo DESC

    Ergebnis ist OK, PostingNo ist fortlaufend also INT(wenn ich ItemNo mit der Spalte der anderen Tabelle vergleiche und die höchste PostingNo müsste die Beziehung 1:1 bestehen).

    Fehler bei
    SELECT ItemNo, TransactionDate, max(PostingNo) FROM Journal GROUP BY ItemNo, TransactionDate:

    [unixODBC][Oracle][ODBC][Ora]ORA-00923: FROM keyword not found where expected

    per

    f($stid === FALSE) {
    die(odbc_errormsg());
    }

    Jemand ne Idee?

    Mfg AngstHab
     
  11. AngstHab

    AngstHab Benutzer

    TransactionDate kann ich leider nicht so nehmen, weil mehrere Datensätze den gleichen Zeitstempel abbekommen haben und das zu einer 1:n Beziehung führen würde.
     
  12. ukulele

    ukulele Datenbank-Guru

    Was ist denn tWord? Hört sich nicht nach Integer an. Von ORDER BY kann man nicht auf den Datentypen schließen, denn auch Zahlen die als Char-Werte gespeichert wurde lassen sich sortieren nur nicht mit max() ausweten.

    Um zu prüfen ob max() funktioniert kannst du einfach
    Code:
    SELECT max(PostingNo)
    FROM Journal
    ausführen und bekommst genau einen Wert oder einen Fehler zurück.
     
  13. AngstHab

    AngstHab Benutzer

    Funktion geht, wenn es als einziges im SELECT Bereich steht und gibt per ODBC-Result den Richtigen Wert an!
    Das hab ich noch nicht getestet gehabt, weil sinnlos ohne Bezugswert bei JOIN!

    .
    .
    JOIN LEFT Journal ON (MNr = ItemNo AND .... )
    .
    .

    Sobald eine weitere Spalte dazu kommt:

    SELECT max(PostingNo) AS maxPostingNo, ItemNo
    FROM Journal

    [unixODBC][Oracle][ODBC][Ora]ORA-00937: not a single-group group function
     
  14. ukulele

    ukulele Datenbank-Guru

    Sobald du eine weitere Spalte im Select Teil angibst muss diese entweder ebenfalls durch eine Aggregatfunktion aggregiert werden oder in einem GROUP BY stehen und gruppiert werden, das ist ganz elementar.
    Code:
    SELECT max(PostingNo) AS maxPostingNo, ItemNo
    FROM Journal
    GROUP BY ItemNo
    
     
  15. AngstHab

    AngstHab Benutzer

    Ich danke für die Hilfestellungen!
    Jetzt in das LEFT JOIN einbauen...

    .
    .
    FROM Order.MNr
    LEFT JOIN (SELECT max(PostingNo) AS maxPostingNo, ItemNo, TotalQuantity
    FROM Journal
    GROUP BY ItemNo, TotalQuantity) AS lastPost ON Order.MNr = lastPost.ItemNo
    .
    .
    ORA-00905: missing keyword <- Irgendwie ist da der Wurm drin.
    Könnte mir da noch mal bitte jemand einen Tip geben?
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden