Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: MarcoBosshard am Januar 27, 2014, 09:48:25

Titel: Kundensegment
Beitrag von: MarcoBosshard am Januar 27, 2014, 09:48:25
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.
Titel: Re: Kundensegment
Beitrag von: Hondo am Januar 27, 2014, 10:06:41
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



Titel: Re: Kundensegment
Beitrag von: MarcoBosshard am Januar 27, 2014, 10:16:07
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
Titel: Re: Kundensegment
Beitrag von: DF6GL am Januar 27, 2014, 10:18:29
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..
Titel: Re: Kundensegment
Beitrag von: MarcoBosshard am Januar 27, 2014, 10:20:41
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?
Titel: Re: Kundensegment
Beitrag von: DF6GL am Januar 27, 2014, 10:27:25
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.
Titel: Re: Kundensegment
Beitrag von: Stapi am Januar 27, 2014, 10:33:46
Hallo
Arbeite doch mit Kombifelder als Datenherkunft deine Produktliste und Filter dann dein Unterformular nach Produkten
Titel: Re: Kundensegment
Beitrag von: MarcoBosshard am Januar 27, 2014, 10:51:23
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
Titel: Re: Kundensegment
Beitrag von: ebs17 am Januar 27, 2014, 10:59:51
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.
Titel: Re: Kundensegment
Beitrag von: MarcoBosshard am Januar 27, 2014, 11:11:57
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
Titel: Re: Kundensegment
Beitrag von: Stapi am Januar 27, 2014, 11:13:44
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
Titel: Re: Kundensegment
Beitrag von: ebs17 am Januar 27, 2014, 12:20:04
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.
Titel: Re: Kundensegment
Beitrag von: Stapi am Januar 27, 2014, 13:28:19
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.
Titel: Re: Kundensegment
Beitrag von: ebs17 am Januar 27, 2014, 13:50:23
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.
Titel: Re: Kundensegment
Beitrag von: Stapi am Januar 27, 2014, 14:28:42
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.
Titel: Re: Kundensegment
Beitrag von: ebs17 am Januar 27, 2014, 15:28:19
Ja, was soll ich anderes sagen als: Lies mehr als den einen Satz.