Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL - Abfrage mit Max (https://www.delphipraxis.net/100326-sql-abfrage-mit-max.html)

HolgerCW 26. Sep 2007 11:49

Datenbank: ORACLE • Version: 9 • Zugriff über: BDE

SQL - Abfrage mit Max
 
Hallo zusammen,

ich habe zwei Tabellen.

Tabelle1:

AUFTRAGNR, TEXT
1, Test1
2, Test2

Tabelle2:

AUFTRAGNR, DATUM
1, 11.10.2007
1, 12.10.2007
1, 13.10.2007
2, 10.10.2007
2, 11.10.2007

Nun möchte ich die Tabellen so verknüpfen, dass von jeder Auftragsnr. nur das grösste Datum angezeigt wird.
-> Einschränkung: Es werden nur Datums berücksichtigt, wo das maximale Datum, älter als 1 Tag ist.
-> angenommenes heutiges Datum: 12.10.2007

Ergebnis:

AUFTRAGNR, TEXT, DATUM
2, 11.10.2007

Gruss

Holger

mkinzler 26. Sep 2007 11:59

Re: SQL - Abfrage mit Max
 
SQL-Code:
select
    t2.AUFTRAGNR, Max(t2.Datum), t1.TEXT
from
    Tabelle2 t2
        join Tabelle1 t1 on t1.AUFTRAGNR=t2.AUFTRAGNR
group by
    t2.AUFTRAGNR, t1.TEXT;

HolgerCW 26. Sep 2007 12:03

Re: SQL - Abfrage mit Max
 
Das klappt so leider nicht,

da jetzt alle Datums berücksichtigt werden. Möchte aber nur die Auftragsnummer anzeigen, wenn das Maximale Datum ÄLTER ALS 1 TAG ist. Da ist der Knackpunkt.

Gruss

Holger

mkinzler 26. Sep 2007 12:08

Re: SQL - Abfrage mit Max
 
Dann erweitere doch die Bedingung

HolgerCW 26. Sep 2007 12:12

Re: SQL - Abfrage mit Max
 
aber wie ?

Delphi-Quellcode:
select
    t2.AUFTRAGNR, Max(t2.Datum), t1.TEXT
from
    Tabelle2 t2 
        left join Tabelle1 t1 on t1.AUFTRAGNR=t2.AUFTRAGNR
        and max(t2.datum) < sysdate - 1
group by
    t2.AUFTRAGNR, t1.TEXT;
Kann ja keine Max - Abfrage im Join verwenden.

Gruss

Holger

HolgerCW 26. Sep 2007 12:15

Re: SQL - Abfrage mit Max
 
und wenn ich mit mit WHERE kann ich auch nicht

Delphi-Quellcode:
WHERE MAX(t2.datum) < sysdate - 1
machen.

Was muss ich tuen ?

Guss

Holger

DeddyH 26. Sep 2007 12:16

Re: SQL - Abfrage mit Max
 
Und so?
SQL-Code:
WHERE t2.datum < sysdate - 1

Hansa 26. Sep 2007 12:23

Re: SQL - Abfrage mit Max
 
Wie wärs hiermit ?

SQL-Code:
select first 1 XY from Z order by Datum desc;
Aber Achtung : das first heißt in Oracle anders.

HolgerCW 26. Sep 2007 12:26

Re: SQL - Abfrage mit Max
 
So würde es klappen,

nur muss die Abfrage auf das Maximale Datum gehen, da sonst wie im Beispiel auch die Auftragsnummer 1 angezeigt würde, da dort ja auch Datums existieren, die älter als 1 Tag sind.

Gruss

Holger

Torpedo 26. Sep 2007 12:39

Re: SQL - Abfrage mit Max
 
Zitat:

Zitat von HolgerCW
und wenn ich mit mit WHERE kann ich auch nicht

Delphi-Quellcode:
WHERE MAX(t2.datum) < sysdate - 1
machen.

Was muss ich tuen ?

Guss

Holger

Probiers mal mit HAVING

ken_jones 26. Sep 2007 12:47

Re: SQL - Abfrage mit Max
 
Du bist nahe dran, aber syntaktisch etwas im Schilf,
das hier entspricht etwa deinem SQL, einfach Oracle tauglich umgestellt:

SQL-Code:
select t1.auftragnr, t1.text, max(t2.datum)
from tabelle1 t1,
     tabelle2 t2
where t1.auftragnr = t2.auftragnr
and t2.datum < trunc(sysdate)
group by t1.auftragnr, t1.text
und um dein Beispiel zu testen:

SQL-Code:
select t1.auftragnr, t1.text, max(t2.datum)
from tabelle1 t1,
     tabelle2 t2
where t1.auftragnr = t2.auftragnr
and t2.datum < to_date('12.Oct.2007') --trunc(sysdate)
group by t1.auftragnr, t1.text
Das würde dann als Resultat folgendes ausspucken:

Code:
AUFTRAGNR TEXT   MAX(T2.DATUM)
1         test1   11.10.07
2         test2   11.10.07

Hansa 26. Sep 2007 12:52

Re: SQL - Abfrage mit Max
 
Zitat:

Zitat von HolgerCW
So würde es klappen,

nur muss die Abfrage auf das Maximale Datum gehen..

Deshalb das DESC, also absteigend sortiert (größtes zuerst und wegen FIRST 1 eben nur eines). Um die Aufträge auseinanderzuhalten notfalls noch :

SQL-Code:
ORDER BY DATUM, AUFTRAGSNR

HolgerCW 26. Sep 2007 12:57

Re: SQL - Abfrage mit Max
 
Zitat:


Das würde dann als Resultat folgendes ausspucken:

Code:
AUFTRAGNR TEXT   MAX(T2.DATUM)
1         test1   11.10.07
2         test2   11.10.07

-> Und genau das wollte ich ja nicht. Auftragsnummer 1 dürfte nicht ausgegeben werden, da das maximale Datum von Auftragsnummer 1 grösser als der 12.10.2007 ist
-> Deshalb muss ich ja das Maximale Datum abfragen, aber wie ?

Weiss hier jemand wie das

[/quote]
Delphi-Quellcode:
select first 1 XY from Z order by Datum desc;
[quote]

in Oracle geht ?

Gruss

Holger

DeddyH 26. Sep 2007 13:13

Re: SQL - Abfrage mit Max
 
Andere Idee (ungetestet):
SQL-Code:
SELECT A.AuftragNr, A.Text, MAX(B.Datum)
FROM Tabelle1 A
JOIN Tabelle2 B ON B.AuftragNr = A.AuftragNr
WHERE NOT EXISTS(
    SELECT * FROM Tabelle2 C
    WHERE TRUNC(C.Datum) >= sysdate
    AND C.AutragNr = B.AuftragNr)
GROUP BY A.Auftragnr,A.Text
//Edit: Im Subselect muss es Tabelle2 heißen

ken_jones 26. Sep 2007 13:29

Re: SQL - Abfrage mit Max
 
Ah so, sorry, hab deinen Text zu schnell gelesen.
Dann halt so rum:

SQL-Code:
select t1.auftragnr, t1.text, max(t2.datum)
from tabelle1 t1,
     tabelle2 t2
where t1.auftragnr = t2.auftragnr
group by t1.auftragnr, t1.text
having max(t2.datum) < to_date('12.Oct.2007') --sysdate

HolgerCW 26. Sep 2007 15:17

Re: SQL - Abfrage mit Max
 
Beide Lösungen klappen einwandfrei.

Super danke

Gruss

Holger

Hansa 26. Sep 2007 17:07

Re: SQL - Abfrage mit Max
 
Wie ist es dir gelungen mit "FIRST 1" zwei Datensätze zurück zu bekommen ? :shock:

HolgerCW 27. Sep 2007 08:50

Re: SQL - Abfrage mit Max
 
Habe die Lösungen von DeddyH und ken_jones ausprobiert. Die haben geklappt.

Gruss

Holger


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz