SQL Abfrage: Suche nach Datensätzen, welche 2x vor

Hallo

Ich habe im Access eine Tabelle „Aufträge“, in welcher folgende Werte vorkommen:

Der Primärkey ist „Auftrag“ (zusammengesetzt aus der Kunden-Nr und einer Fortlaufnummer nach dem Punkt)

Auftrag Kunde
451.1 451
451.2 451
462.1 462
468.1 468
515.1 515
515.2 515
515.3 515

Und ich möchte nun in einer Abfrage alle Auftrags-Datensätze erhalten von Kunden, welche mehr als einen Auftrag haben.

Eigentlich hätte ich erwartet, dass folgendes Query das gewünschte Resultat bringt, aber das ergibt überhaupt keine Antwort.

SELECT *
FROM AUFTRAEGE
WHERE AUFTRAEGE.KUNDE = AUFTRAEGE.KUNDE AND
AUFTRAEGE.AUFTRAG AUFTRAEGE.AUFTRAG;

warum ist dies falsch? wie sollte die Abfrage stattdessen aussehen?

Vielen Dank!

Hallo,

dein Query ist falsch weil du mit
AUFTRAEGE.AUFTRAG AUFTRAEGE.AUFTRAG
abfragst welche Auftragsnummer ungleich sich selbst ist.

Stattdessen liefert dir

SELECT substr(auftraege.kunde, 1, 3), count(*)
FROM auftraege
GROUP BY substr(auftraege.kunde, 1, 3)
HAVING count(*) > 1

die ersten drei Stellen deiner Auftragsnummer deren Anzahl Vorkommen > 1 ist, das sind also die Kundennummern derer die mehr als einen Auftrag haben.

Problem gelöst ?

Gruss,
SomeOne

danke für die antwort, leider unterstützt access den befehl substring nicht :frowning:

mein gedanke hinter dem auftrag auftrag war eben, dass die kunden-nr bei beiden datensätzen die selbe ist, die auftrags-nr sich aber unterscheidet. aber das scheint so nicht zu gehen

habs geschafft :smile:

SELECT *
FROM auftraege T1
WHERE EXISTS
(SELECT T2.kunde
FROM auftraege T2
WHERE RIGHT(t2.auftrag,1) > 1 AND
t1.kunde = T2.kunde);

Servus,

ich kenne das Access SQL nicht, aber RIGHT liefert dir die rechten n Stellen des Argumentes, ja ?

Irgendwie scheint mir immer noch die Anzahl der Aufträge nicht ermittelt zu werden, und das sollte doch dein Kriterium sein.

Ich werde das Gefühl nicht los, dass du nach der rechtsesten (sorry für die Wortschöpfung) Stelle der Auftragsnummer unterscheidest, das funktioniert zwischen 0 und 9. Du selektierst doch die Kundennummern, deren Rechts-Aussen-Auftragsnummern-Stelle grösser 1 sind, oder ?

Oder habe ich das Access SQL da so missverstanden ?

Du solltest evtl. doch mal mit count(*), GROUP BY und HAVING probieren … und Access unterstützt sicher auch eine Art SUBSTR Funktion, da mögen sich bitte mal die Access-Kundigen einblenden.

Viel Erfolg weiter,
SomeOne

Suche nach Datenmodell
Moin, neni2,

habs geschafft :smile:

bist Du sicher?

 SELECT \*
 FROM auftraege T1
 WHERE EXISTS
 (SELECT T2.kunde
 FROM auftraege T2
 WHERE RIGHT(t2.auftrag,1) \> 1 
 AND t1.kunde = T2.kunde);

damit fällst Du auf die Nase, wenn der Sachbearbeiter auf die Idee kommt, Auftrag.1 zu löschen. Oder wenn der Zähler mehr als 1 Ziffer hat.

Dein Datenmodell taugt nichts. Gib dem Auftrag eine unabhängige - nichtssagende - Identifikation, stell die Kundennummer als Beziehungsattribut dazu und fertig ist die Laube.

Gruß Ralf

Hallo,
stimme drambeldier voll und ganz zu!
Das was du machst verstößt gegen die erste Normalform, jedes Attribut ist atomar, d.h. in jedem Feld steht nur eine Information und nicht wie bei dir:
Kundennummer + Primärschlüssel (eine fortlaufende Nummer ist nämlich ein perfekter PK)

Ein gutes Datenmodell erleichtert alles :wink:
http://de.wikipedia.org/wiki/Normalisierung_%28Daten…

MfG Dominik