Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Bestimmt Datensätze anzeigen (https://www.delphipraxis.net/175611-bestimmt-datensaetze-anzeigen.html)

Dumpfbacke 3. Jul 2013 19:10

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBX

Bestimmt Datensätze anzeigen
 
Hallo Leute,
ich komme einfach nicht weiter. Könnte mir jemand mal von dem Schlauch helfen aus dem ich stehe.
Als Ergebnis möchte ich alle IDs und das größte Datum von Wert1 haben bei denen in allen Spalten des Wert1 ein Datum steht. Die IDs bei denen mindestens in einem Feld der Spalte Wert1 kein Datum steht soll nicht angezeigt werden. Die Anzahl der Datensätze kann unterschiedlich sein. Es kann z.B. sein das es die ID 18 nur einmal gibt und die ID 17 50 mal vorhanden ist. Ich habe schon mit Group by usw. probiert.

Code:
Hier ein beispiel der Tabelle:

ID        Wert1         Anzahl
1          12.03.2013    17
1          15.06.2013    14
2          21.06.2013    105
2          NULL
3          17.04.2013    104 
4          NULL
Was mache ich den falsch hier ? :evil:

Als Ergebnis würde ich erwarten

Code:
ID       Wert1
1         15.06.2013
3         17.04.2013
Die ID 2 und 4 sollte nicht erscheinen
Tanja

DeddyH 3. Jul 2013 19:22

AW: Bestimmt Datensätze anzeigen
 
Ungetestet:
SQL-Code:
SELECT
  ID, Wert1
FROM
  Tabelle A
WHERE
  Wert1 IS NOT NULL
AND
  Wert1 = (
    SELECT
      MAX(Wert1)
    FROM
      Tabelle
    WHERE
      ID = A.ID
    )

Dumpfbacke 3. Jul 2013 19:43

AW: Bestimmt Datensätze anzeigen
 
Danke für die Info, doch leider geht es nicht. Bei Deinem Beispiel kommt hier die ID 2 mit raus. Es gibt ja eine Zeile bei der in Wert1 ein Datum steht und das zeite ist logischerweise dann auch das selbe. Ich hatte schon Zweifel an mir. Ich bin hier schon seit drei Stunden an dem Problem und es kann jemand innerhalb von Mitnuten lösen (Was mich jedoch sehr gefreut hätte).

nahpets 3. Jul 2013 20:29

AW: Bestimmt Datensätze anzeigen
 
Suchst Du sowas?
Code:
select max(wert1) As Wert, id
from tabelle
where wert1 is not null
group by id
order by id
oder ist Null quasi größer als jedes beliebige Datum anzusehen und falls vorhanden soll die entsprechende ID nicht ausgegeben werden?

Unter Oracle könnte das eventuell so gehen:
Code:
select * from (
  select max(nvl(wert1,To_Date('31.12.9999')) As Wert, id
  from tabelle
  group by id
)
where wert < To_Date('31.12.9999')
order by id
Wenn der Inhalt einer Spalte Null ist, so ersetzt nvl dieses Null durch den angegebenen Wert. Kennt Firebird eine entsprechende Funktion? Wenn nicht, diese selber bauen.

Dumpfbacke 4. Jul 2013 05:22

AW: Bestimmt Datensätze anzeigen
 
Zitat:

Zitat von nahpets (Beitrag 1220665)
oder ist Null quasi größer als jedes beliebige Datum anzusehen und falls vorhanden soll die entsprechende ID nicht ausgegeben werden?

Unter Oracle könnte das eventuell so gehen:
Code:
select * from (
  select max(nvl(wert1,To_Date('31.12.9999')) As Wert, id
  from tabelle
  group by id
)
where wert < To_Date('31.12.9999')
order by id
Wenn der Inhalt einer Spalte Null ist, so ersetzt nvl dieses Null durch den angegebenen Wert. Kennt Firebird eine entsprechende Funktion? Wenn nicht, diese selber bauen.

Ja genau so soll es sein. Die ID 2 soll nicht ausgegeben sein. NULL soll größer sein als jedes Datum. Das ganze nur unter Firebird 2.5

mkinzler 4. Jul 2013 08:07

AW: Bestimmt Datensätze anzeigen
 
NVL() gibt es als UDF. Besser ist es aber die builtin Fuktion COALESCE() zu verwenden

dataspider 4. Jul 2013 14:17

AW: Bestimmt Datensätze anzeigen
 
Code:
select
  distinct
  id, (select max(y.wert) from test y where y.id = t.id) as wert
  from test t
  where not exists(select x.id from test x where x.id = t.id and x.wert is null)
oder

Code:
select
  t.id
, max(t.wert) as wert
  from test t
  where not exists(select x.id from test x where x.id = t.id and x.wert is null)
  group by t.id
Test natürlich in deinen Tabellennamen ändern.

Frank

Dumpfbacke 4. Jul 2013 19:05

AW: Bestimmt Datensätze anzeigen
 
Zitat:

Zitat von dataspider (Beitrag 1220748)
Code:
select
  distinct
  id, (select max(y.wert) from test y where y.id = t.id) as wert
  from test t
  where not exists(select x.id from test x where x.id = t.id and x.wert is null)
oder

Code:
select
  t.id
, max(t.wert) as wert
  from test t
  where not exists(select x.id from test x where x.id = t.id and x.wert is null)
  group by t.id
Test natürlich in deinen Tabellennamen ändern.

Frank

Funktioniert leider beides nicht.
Tanja

dataspider 4. Jul 2013 20:03

AW: Bestimmt Datensätze anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir geht beides (siehe Anhang).
Aber da habe ich wohl sicher etwas falsch verstanden...

Und WERT muss natürlich WERT1 heißen, aber das hast du sicher schon bemerkt.

Frank

alex517 4. Jul 2013 20:32

AW: Bestimmt Datensätze anzeigen
 
Versuchs mal damit
SQL-Code:
select
  TT.ID,
  MAX(TT.MAXDATUM)
from
  (select T.ID,
          COALESCE(T1.WERT1, '9999-01-01') MAXDATUM
        from
          T
        ORDER BY
          T.ID) TT
GROUP by
  TT.ID
having
  MAX(TT.MAXDATUM) < '9999-01-01'
Edit:
@dataspider
Deine Querys funktionieren auch, sind aber teurer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:05 Uhr.
Seite 1 von 2  1 2   

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