Ich hab ein Problem mit folgender Abfrage.
Ich habe ein Konto und eine Tabelle Einzahlung und eine für Auszahlungen.
Nun möchte ich die Konten anzeigen in denen in letzter Zeit(uhrzeit) entweder eine Einzahlung oder eine Auszahlung gemacht wurde.
Es soll kein Konto doppelt angezeigt werden.
dankeCode:--DROP TABLE konto; --DROP TABLE einzahlung; --DROP TABLE auszahlung; CREATE TABLE konto ( id integer NOT NULL, beschreibung character varying, CONSTRAINT konto_pkey PRIMARY KEY (id) ); INSERT INTO konto VALUES(1, 'Konto 1'); INSERT INTO konto VALUES(2, 'Konto 2'); INSERT INTO konto VALUES(3, 'Konto 3'); CREATE TABLE einzahlung ( id integer NOT NULL, konto_id integer, betrag integer, uhrzeit timestamp, CONSTRAINT einzahlung_pkey PRIMARY KEY (id) ); INSERT INTO einzahlung VALUES (1, 1, 199, '2009-08-26 10:00:00'); INSERT INTO einzahlung VALUES (2, 1, 299, '2009-08-30 10:00:00'); INSERT INTO einzahlung VALUES (3, 2, 399, '2009-08-28 10:00:00'); INSERT INTO einzahlung VALUES (4, 3, 499, '2009-08-29 10:00:00'); CREATE TABLE auszahlung ( id integer NOT NULL, konto_id integer, betrag integer, uhrzeit timestamp, CONSTRAINT auszahlung_pkey PRIMARY KEY (id) ); INSERT INTO auszahlung VALUES (1, 3, 57, '2010-01-01 00:00:01'); INSERT INTO auszahlung VALUES (2, 1, 199, '2009-01-26 10:00:00');
Franz
Geändert von franz_m22 (26.08.2010 um 16:05 Uhr)
Hi,
mal davon abgesehen, dass ich es nicht sinnvoll finde für Ein- und Auszahlungen eine extra Tabelle anzulegen:
Gruss ToniCode:select distinct id, beschreibung from konto wehre konto_id in (select distinct konto_id from einzahlung where uhrzeit > 'deinwert') or konto_id in (select distinct konto_id from auszahlung where uhrzeit > 'deinwert')
wer bis zum hals in der scheisse steckt, der sollte den kopf nicht hängen lassen
danke Toni.
Ich glaube ich hab das Problem ungenau beschrieben.
Ich möchte nicht die Konten mit Änderungen ab einem bestimmten Zeitpunkt sonder die reihenfolge anhand der uhrzeit absteigend.
Das Ergebnis sollte sein
id | Beschreibung
-----------------------
3 | Konto 3
1 | Konto 1
2 | Konto 2
das konto das sich als vor kürzerster zeit geändert hat war konto 3 (wegen der auszahlung am 2010-01-01 00:00:01)
das vorletzte konto war konto nummer 1 ('2009-08-30 10:00:00')
und davor konto 2 ('2009-08-28 10:00:00')
Dann möchte ich auf diesen Satz nochmal zurückkommen:franz_m22
danke Toni.
Ich glaube ich hab das Problem ungenau beschrieben.
Ich möchte nicht die Konten mit Änderungen ab einem bestimmten Zeitpunkt sonder die reihenfolge anhand der uhrzeit absteigend.
Das Ergebnis sollte sein
id | Beschreibung
-----------------------
3 | Konto 3
1 | Konto 1
2 | Konto 2
das konto das sich als vor kürzerster zeit geändert hat war konto 3 (wegen der auszahlung am 2010-01-01 00:00:01)
das vorletzte konto war konto nummer 1 ('2009-08-30 10:00:00')
und davor konto 2 ('2009-08-28 10:00:00')
Eine Tabelle Umsatz wäre wesentlich sinnvoller. Dann ein einfaches max() auf die Uhrzeit, noch ein order by und fertig...dass ich es nicht sinnvoll finde für Ein- und Auszahlungen eine extra Tabelle anzulegen
Zwar nicht schön, aber funktioniert:
Code:testdb=# select distinct a.id, a.beschreibung, max(b.uhrzeit) as uhrzeit from konto a testdb-# left join testdb-# (select distinct konto_id, uhrzeit from auszahlung testdb(# union select distinct konto_id, uhrzeit from einzahlung) as b testdb-# on a.id = b.konto_id testdb-# group by a.id, a.beschreibung order by uhrzeit desc; id | beschreibung | uhrzeit ----+--------------+--------------------- 3 | Konto 3 | 2010-01-01 00:00:01 1 | Konto 1 | 2009-08-30 10:00:00 2 | Konto 2 | 2009-08-28 10:00:00 (3 rows) testdb=#
wer bis zum hals in der scheisse steckt, der sollte den kopf nicht hängen lassen
Den JOIN mit der Konto-Tabelle überlasse ich Dir zur Übung ;-)Code:test=*# select * from einzahlung ; id | konto_id | betrag | uhrzeit ----+----------+--------+--------------------- 1 | 1 | 199 | 2009-08-26 10:00:00 2 | 1 | 299 | 2009-08-30 10:00:00 3 | 2 | 399 | 2009-08-28 10:00:00 4 | 3 | 499 | 2009-08-29 10:00:00 (4 Zeilen) Zeit: 0,324 ms test=*# select * from auszahlung ; id | konto_id | betrag | uhrzeit ----+----------+--------+--------------------- 1 | 3 | 57 | 2010-01-01 00:00:01 2 | 1 | 199 | 2009-01-26 10:00:00 (2 Zeilen) Zeit: 0,216 ms test=*# select konto_id, max(uhrzeit) from (select konto_id, max(uhrzeit) as uhrzeit from einzahlung group by konto_id union all select konto_id, max(uhrzeit) as uhrzeit fromauszahlung group by konto_id) foo group by konto_id; konto_id | max ----------+--------------------- 1 | 2009-08-30 10:00:00 3 | 2010-01-01 00:00:01 2 | 2009-08-28 10:00:00 (3 Zeilen)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Danke Andreas. Genau das hab ich gesucht.
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen