Fehlende Aggregatfunktionen MAX

AngstHab

Benutzer
Beiträge
23
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
 
Werbung:
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:
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
 
Code:
SELECT   ItemNo,
     TransactionDate,
     max(PostingNo) AS maxPostingNo
FROM   Journal
GROUP BY ItemNo,TransactionDate
 
odbc_exec(): SQL error: [unixODBC][Oracle][ODBC][Ora]ORA-00923: FROM keyword not found where expected\n, SQL state S1000 in SQLExec Dir execDirect
 
Das müsste doch eigentlich den gleichen Effect haben?

LEFT JOIN ((SELECT ItemNo, TransactionDate, PostingNo
FROM journal
ORDER BY PostingNo DESC)
WHERE ROWNUM <= 1 )
 
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.
 
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
 
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.
 
PostingNo - 4 - tWord - Not NULL
[...]
ORDER BY PostingNo DESC

Ergebnis ist OK, PostingNo ist fortlaufend also INT
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.
 
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
 
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
 
Werbung:
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?
 
Zurück
Oben