sql doppelte einträge ausblenden

rollon

Benutzer
Beiträge
12
Hallo,
Ich stehe vor folgendem Problem :
Ich habe zwei Tabellen:
Tabelle Kunde und Tabelle Fahrzeug

Ich muss alle Kunden selektieren und dazu das Feld Kennzeichen aus der Tabelle Fahrzeug dazufügen.
Nun gibt es in der Tabelle Fahrzeug mehrere Einträge zu einem Kunden. Ich benötige jedoch pro Kunde nur eine Zeile.

Wie könnte man das lösen?

1 Huber
2 Maier

1 w2350
1 w5578
2 w9987
2 w9999
2 w3333

Ausgabe:
1 Huber w2350
2 Maier w9987
 
Werbung:
Es sollte das erste Kennzeichen genommen werden. Außerdem darf das Löschkennzeichen nicht gesetzt sein Loeschkz = 'N'
 
Es sollte das erste Kennzeichen genommen werden.

Es gibt in Datenbanken kein 'erstes', solange man nicht sortiert.

Code:
te
test=*# create table rollon(t text);
CREATE TABLE
test=*# insert into rollon values ('erster');
INSERT 0 1
test=*# insert into rollon values ('zweiter');
INSERT 0 1
test=*# select * from rollon;
  t   
---------
 erster
 zweiter
(2 Zeilen)

test=*# update rollon set t = 'erster' where t = 'erster';
UPDATE 1
test=*# select * from rollon;
  t   
---------
 zweiter
 erster
(2 Zeilen)

test=*#


Du must also exakt definieren, was Du willst. Oder MySQL nehmen, das hat eine eingebaute Zufallsfunktion für Ergebnisse ;-)
 
Bei meiner Abfrage ist es nicht relevant, welches Kennzeichen kommt, wenn es mehrere gibt.
Hintergrund : Die Daten sollen in die Telefonanlage eingespielt werden. Wenn ein Kunde anruft, soll der Name und ein Kennzeichen aufscheinen.
 
ok, die Lösung im #3 funktioniert. Ich bräuchte noch eine zusätzliche Spalte. Leider funktioniert die Abfrage nur mit 2 Spalten. Gibt's eine Möglichkeit 3 Spalten auszugeben?
 
Entschuldige wenn die Frage zu undeutlich war.
Meine Abfrage gibt mir das richtige Ergebnis.

select a.gptnrkunde, min(a.amtkennz) as amt from (select * from fahrzeug where loeschkz = 'N') a
group by a.gptnrkunde

Nun möchte ich es um die Modellbezeichnung erweitern.:

select a.gptnrkunde, a.modbezeichnung, min(a.amtkennz) as amt from (select * from fahrzeug where loeschkz = 'N') a
group by a.gptnrkunde

Ich bekomme jedoch einen Fehler. Gibt es eine Möglichkeit die 3. Spalte reinzukriegen?
 
Du hast, vereinfacht, diese Tabelle und diesen Fehler, oder?

Code:
test=*# create table demo(a int, b int, c int);
CREATE TABLE
test=*# select a, max(c) from demo group by a;
 a | max
---+-----
(0 Zeilen)

test=*# select a,b, max(c) from demo group by a;
FEHLER:  Spalte »demo.b« muss in der GROUP-BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden
ZEILE 1: select a,b, max(c) from demo group by a;
  ^
test=*#

Das schöne an PostgreSQL ist u.a. auch, daß in der Fehlermeldung schon steht, wie man das Problem lösen kann.
 
In Oracle lautet die Fehlermeldung eigentlich genauso...
Wieso ist es immer so schwer die Fehlermeldung zu posten anstatt nur kund zu tun, dass es einen gegeben hat?
 
Wenn ich a.modbezeichnung in der group by - Bedingungerscheinen lasse lasse, bekomme ich wieder mehr Ergebnisse mit mehreren Kennzeichen pro Geschäftspartnernummer

Abfrage:
select a.gptnrkunde, a.modbezeichnung, min(a.amtkennz) as amt from (select * from fahrzeug where loeschkz = 'N') a
group by a.gptnrkunde, a.modbezeichnung
 
Hallo Rollon,

schwer festzustellen wo dein Problem liegt!. Aber ich versuche es mal ...

So wie ich dich verstehe soll nur ein Datensatz pro Geschäftspartnernummer zurückgegeben werden. Also darf eine Gruppierung eben auch nur auf die Geschäftspartnernummer erfolgen, wenn du die Gruppierung auch auf die modbezeichnung erweiterst erzeugst du eine Variants die zwangsweise bei mehreren Modbezeichnungen pro Geschäftspartnernummer entsteht. Also so ...

SELECT gptnrkunde,
MAX(modbezeichnung) a,
MAX(amtkennz) b
FROM Fahrzeug
WHERE loeschkz = 'N'
GROUP gptnrkunde

Hoffe das es dir hilft ... Monarch
 
Werbung:
Zurück
Oben