Hallo zusammen
Ich komme nicht weiter...kann mir hier jemand helfen?
Ich habe zwei Tabellen: T_KUNDEN mit allen meinen Kunden und T_PRODUKT als Zuweisungstabelle der Produkte zu den Kunden. Jeder Kunde kann beliebig viele Produkte haben.
Das Ziel ist es, dass ich spezielle Kundengruppen herausfiltern kann, welche nur bestimmte Produkte haben. Andere Produkte darf er nicht haben.
Beispiel: Ich möchte die Kunden haben, welche ein Produkt 1 und/oder 5 haben.
Erbebnis: Kunde 116 und 118
T_Kunde (Jeder Kunde eine Zeile)
KD_NR, NAME, ORT
115, Meier, Basel
116, Müller, München
117, Bachmann, Paris
118, Flachmann, Detroit
T_Produkt
KD_NR, PROD_NR, PROD_NAME
115, 1, Produkt1
115, 5, Produkt5
115, 27, Produkt27
116, 1 Produkt1
117, 27, Produkt27
117, 55, Produkt55
118, 1, Produkt1
118, 5, Produkt5
Diese zwei Tabellen kann ich mir der Kundennummer (KD_NR) in eine Beziehung stellen.
Ist das einigermassen so verständlich geschrieben?
Danke vielmals im voraus.
Hallo,
beide Tabellen im Abfrageeditor einfügen,
KD_Name, Ort, Prod_NR runterziehen in die Feldleiste,
Nach den ersten beiden Gruppieren und bei Prod_NR Bedingung einstellen und als Kriterien 1 und 5 untereinander schreiben.
Ergibt folgendes SQL
SELECT T_Kunde.[KD-Name], T_Kunde.Ort
FROM T_Kunde INNER JOIN T_Produkt ON T_Kunde.KD_NR = T_Produkt.KD_NR
WHERE (((T_Produkt.PROD_NR)=1)) OR (((T_Produkt.PROD_NR)=5))
GROUP BY T_Kunde.[KD-Name], T_Kunde.Ort;
ANMERKUNG
Feldbezeichner "Name" ist verboten weil es eine Eigenschaft darstellt.
In der Tabelle T_Produkt fehlt der Primärschlüssel, einfach Feld id mit Autowert einfügen, fertig.
Gruß Andreas
Hallo Hondo
Danke für deinen Tipp. Soweit bin ich auch schon gekommen. Das Problem ist aber, dass ich dann alle Kunden habe die eines oder mehrere der gewählten Produkte haben. Sobald der Kunde aber auch ein anderes Produkt hat, darf er nicht mehr erscheinen. Ich möchte also eine Liste bei welchem nur die Kunden drauf sind, welche ausschliesslich eines oder mehrere der erwähnten Produkte haben....das ist die Knacknuss...
Gruss Marco
Hallo,
versuch, mit der Count-Funktion weiterzukommen:
SELECT T_Kunde.[KD_Name], T_Kunde.Ort
FROM T_Kunde INNER JOIN T_Produkt ON T_Kunde.KD_NR = T_Produkt.KD_NR
WHERE (((T_Produkt.PROD_NR)=1)) OR (((T_Produkt.PROD_NR)=5))
GROUP BY T_Kunde.[KD-Name], T_Kunde.Ort [color=red]Having Count(*) = 2[/color]
"2" für zwei Produkte..
Hallo DF6GL
Das Problem ist, dass ich die Anzahl gar nicht kenne. Er kann von jedem Produkt beliebig viele haben....dann klappt das Count nicht mehr, oder?
Hallo,
Die Anzahl der zu filternden Produkte kennst Du doch: Produkt 1 und 5 = 2 Produkte
Es geht nicht um die Anzahl der Produkte als solches, sondern um die Anzahl der für die Filterung angegebenen Produkte (--> 2)
evtl. muss es auch
Having Count(*) <= 2
heißen, wenn der Kunde mindenstens eines der Kriterien erfüllt.
Hallo
Arbeite doch mit Kombifelder als Datenherkunft deine Produktliste und Filter dann dein Unterformular nach Produkten
Hallo
Das mit dem Count. Es kann ja auch sein, dass der Kunde auch eine Anzahl 2 hat aber von anderen Produkten. Er kann x-beliebe Produkte von jedem haben...
ich vermute jetzt, dass ich auf dem Schlach stehe... :o
SELECT
P.KD_NR,
Count(P.PROD_NR) AS Anzahl_P
FROM
T_Produkt AS P
WHERE
P.PROD_NR IN (1, 5, 27)
GROUP BY
P.KD_NR
HAVING
COUNT(*) =
(
SELECT
COUNT(*)
FROM
T_Produkt AS P1
WHERE
P1.KD_NR = P.KD_NR
)
"PROD_NR IN (1, 5, 27)" oder alternativ "PROD_NR = 1 OR PROD_NR = 5 OR PROD_NR = 27)" müsste dynamisch in die SQL-Anweisung eingebracht werden, da hier eine normale Parameterübergabe scheitern wird.
Ich habe mich hier auf die Verwendung der beiden Schlüssel beschränkt, was dann auch die Verwendung einer korrekteren m:n-Beziehung und hier in erster Linie der Zwischentabelle nahelegt.
Der Ansatz war hier bereits nachzulesen: http://is.gd/cEjteX
Hätte man hier nicht nur schlicht den Vorschlag von Nouba kopiert, sondern auch versucht, die verwendete Idee zu verstehen, würde es nicht schwerfallen, Überflüssiges aus SELECT-Teil und Gruppierung zu entfernen.
Hallo ebs17
Danke vielmals für deine Hilfe. Ich habe dein SQL nun in meine DB gepflegt und an meine Felder angepasst. Die erste Datensichtung sieht nicht schlecht aus. Ich glaube das war die Lösung. Werde mich jetzt aber noch hinter deinen Code setzen um ihn auch zu verstehen. Habe bis jetzt noch nicht mit dem Count gearbeitet.
Gruss Marco
Hallo
Oder du verwendest auf deinen Formular mehre Kombifelder Aufgebaut als Mehrstufiger Filter. Damit kannst du auch in der Zukunft alle Kombinationen suchen und Anzeigen lassen
Die Idee ist übersichtlich: Pro Datensatz gibt es nur eine Kunden-Produkt-Kombination. Also kommt man mit einer einfachen AND-Kombination nicht weiter.
Daher zählt man hier alle Kombinationen entsprechend Produktauswahl sowie alle vorhandenen Kombinationen. Wenn beide Anzahlen übereinstimmen, gibt es keine Produkte außerhalb der Auswahl.
Ein anderer Weg wäre, die Produkte zu ermitteln, die nicht der Auswahl entsprechen (=> Inkonsistenzabfrage). Die gesuchten Kunden wären dann die, die kein Produkt der nichtausgewählten Produkte hätten (=> erneute Inkonsistenzabfrage).
SELECT DISTINCT
X.KD_NR
FROM
T_Produkt AS X
LEFT JOIN
(
SELECT
A.KD_NR
FROM
T_Produkt AS A
LEFT JOIN
(
SELECT
PROD_NR
FROM
T_Produkt
WHERE
PROD_NR IN (1, 5)
) AS S
ON A.PROD_NR = S.PROD_NR
WHERE
S.PROD_NR Is Null) AS Y
ON X.KD_NR = Y.KD_NR
WHERE
Y.KD_NR IS NULL
Ob Stapi das mit Kombifeldern nachbilden kann, da wäre ich neugierig.
Hallo
ZitatOb Stapi das mit Kombifeldern nachbilden kann, da wäre ich neugierig
@ebs17 Es geht mir hier nicht darum deinen Code in Frage zustellen.
Es ist doch sicher möglich über ein Suchformular bestimmte Produkte anhand von Kombifelder (von-bis, nur) zu suchen, wenn nun die Tabellen Beziehung stimmen werden auch hier die Kunden angezeigt die für das Produkt zutreffend sind.
ZitatKunden angezeigt die für das Produkt zutreffend sind
Das ist simpel. Hier in der Aufgabe gibt es aber die Zusatzaufgabe, dass auszuwählende Kunden keines der nicht ausgewählten Produkte haben dürfen.
Meine Neugier ist dann echte Neugier, ob Dir ein zusätzlicher Weg einfällt. Echte Freude hätte ich dann, wenn meine Vorschläge in Sachen Einfachheit in Erstellung und Ausführung übertroffen werden. Da hätte ich meinen persönlichen Lerneffekt.
Hallo
@Ebs17
Das war im ersten Post die gestellte Aufgabe
ZitatBeispiel: Ich möchte die Kunden haben, welche ein Produkt 1 und/oder 5 haben/quote]
So ist das von dir gelesen
ZitatHier in der Aufgabe gibt es aber die Zusatzaufgabe, dass auszuwählende Kunden keines der nicht ausgewählten Produkte haben dürfen.Zitat
das heist du suchst alle Kunden die nicht das Produkt fertigen, ich suche alle Kunden die das Produkt fertigen
Sicher ist dein Code einfach, meine Idee ist hier aufzuzeigen das es auch einen anderen Weg gibt.
Ja, was soll ich anderes sagen als: Lies mehr als den einen Satz.