Ergebnis 1 bis 6 von 6

Thema: Abfrage letzte änderung aus zwei tabllen

  1. #1
    franz_m22 ist offline Neuer Benutzer
    Registriert seit
    07.09.2008
    Beiträge
    12

    Standard Abfrage letzte änderung aus zwei tabllen

    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.

    Code:
    --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');
    danke
    Franz
    Geändert von franz_m22 (26.08.2010 um 16:05 Uhr)

  2. #2
    toni_83 ist offline Benutzer
    Registriert seit
    08.07.2008
    Beiträge
    42

    Standard

    Hi,

    mal davon abgesehen, dass ich es nicht sinnvoll finde für Ein- und Auszahlungen eine extra Tabelle anzulegen:
    Code:
    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')
    Gruss Toni
    wer bis zum hals in der scheisse steckt, der sollte den kopf nicht hängen lassen

  3. #3
    franz_m22 ist offline Neuer Benutzer
    Registriert seit
    07.09.2008
    Beiträge
    12

    Standard

    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')

  4. #4
    toni_83 ist offline Benutzer
    Registriert seit
    08.07.2008
    Beiträge
    42

    Standard

    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')
    Dann möchte ich auf diesen Satz nochmal zurückkommen:

    ..dass ich es nicht sinnvoll finde für Ein- und Auszahlungen eine extra Tabelle anzulegen
    Eine Tabelle Umsatz wäre wesentlich sinnvoller. Dann ein einfaches max() auf die Uhrzeit, noch ein order by und fertig.

    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

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von franz_m22 Beitrag anzeigen
    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.

    Code:
    --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');
    danke
    Franz
    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)
    Den JOIN mit der Konto-Tabelle überlasse ich Dir zur Übung ;-)

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  6. #6
    franz_m22 ist offline Neuer Benutzer
    Registriert seit
    07.09.2008
    Beiträge
    12

    Standard

    Danke Andreas. Genau das hab ich gesucht.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum