Alle Zeilen in Kreuztabelle anzeigen

Moderator: ModerationP

Alle Zeilen in Kreuztabelle anzeigen

Beitragvon Joachim66 » 11. Jan 2017, 21:10

Hallo,

ich habe 3 Tabellen mit n:m-Beziehung:

tblKunde
--------
IDKunde
txtName


Produkte
--------
IDProdukt
txtProdukt


Bestellungen
------------
IDBestellung
lngKunde
lngProdukt
txtDatum

"Bestellungen" hat noch einen Index, der verhindert, dass ein Kunde ein Produkt doppelt bestellt.

Jetzt möchte ich das mit einer Kreuztabelle darstellen: Eine Zeile je Kunde - auch, wenn er noch nichts bestellt hat. Und hinter dem Kundennamen Spalten je Produkt, in den Feldern soll das Bestelldatum angezeigt werden. Eigentlich einfach. Aber ich bekomme es nicht hin - mir fehlen die Kunden, die noch nichts bestellt haben.

Joachim
Joachim66
 

Re: Alle Zeilen in Kreuztabelle anzeigen

Beitragvon Marmeladenglas » 11. Jan 2017, 21:23

Hallo,
dir fehlt noch eine 4te Tabelle (Bestelldetails).
Oder umfasst eine Bestellung maximal 1 Produkt ?

Auf Grundlage der 3 Tabellen, könnte das evtl zum Ziel führen (bitte Namen anpassen):

Code: Alles auswählen
TRANSFORM First(Nz([Bestelldatum],"-")) AS BDatum
SELECT TblKunde.Kunde
FROM TblProdukt RIGHT JOIN (TblKunde LEFT JOIN TblBestellung ON TblKunde.Kunde_ID = TblBestellung.Kunde_ID_F) ON TblProdukt.Produkt_ID = TblBestellung.Produkt_ID_F
GROUP BY TblKunde.Kunde
PIVOT Nz([Produkt],"-");

Warum ist bei dir Datum Text ?
Ob es Sinn macht, den Datentyp im Feldnamen voranzustellen, mmh ...
Ob die Kreuztabellenabfrage Spaß macht, wenn es viele Produkte gibt .... mmh...

mir fehlen die Kunden, die noch nichts bestellt haben.

Hier hättest du deinen Versuch zeigen sollen (SQL-String).
Marmeladenglas
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 16522
Registriert: 23. Jan 2008, 18:55

Re: Alle Zeilen in Kreuztabelle anzeigen

Beitragvon Joachim66 » 11. Jan 2017, 22:13

Danke Marmeladenglas!

Das ist schon fast, was ich mir vorgestellt habe. Aber was noch ziemlich stört, ist die Spalte "-". Wie unterdrücke ich die? Wenn ich es ohne Nz() versuche, steht als Spaltenüberschrift "<>". Sieht dann sogar noch dämlicher aus.

Natürlich sind die Feldnamen etc fiktiv, ich wollte ein allgemeinverständliches Beispiel konstruieren, so dass man sich nicht in die Details meiner DB hineindenken muss.
Joachim66
 

Re: Alle Zeilen in Kreuztabelle anzeigen

Beitragvon Marmeladenglas » 11. Jan 2017, 22:36

Sollen grundsätzlich alle Produkte angezeigt werden, auch wenn sie noch nie bestellt wurden ?
Marmeladenglas
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 16522
Registriert: 23. Jan 2008, 18:55

Re: Alle Zeilen in Kreuztabelle anzeigen

Beitragvon Joachim66 » 12. Jan 2017, 08:38

Das ist nicht unbedingt notwendig.

Ich kenne übrigens "fixierte Spaltenüberschriften". Aber weil ich nicht weiß, ob inzwischen neue Produkte hinzugekommen sind, komme ich damit auch nicht weiter - meines Wissens muss man ja die Liste der fixierten Spalten als festen Text eingeben. Oder geht das irgendwie anders?
Joachim66
 

Re: Alle Zeilen in Kreuztabelle anzeigen

Beitragvon Nouba » 12. Jan 2017, 08:53

Du kannst alle Kunden und alle Produkte in einer Abfrage kombinieren und in der Kreuztabellenabfrage dann mittels Left-Join auf die tatsächlichen Daten verweisen. Bei 64 Produkten wäre aber das Ende der Fahnenstange erreicht.

Ob diese Darstellung dann für Klarheit oder für Verwirrung sorgt, muss man dann selbst für sich entscheiden.
mit freundlichen Grüssen Nouba

Wenn beim Lesen eines Beitrags der Eindruck entsteht, dass sich der Fragesteller wenig Mühe gegeben hat, so erhöht das nicht unbedingt die Motivation, eine Antwort zu verfassen.
Nouba
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 15763
Registriert: 13. Mär 2006, 12:55
Wohnort: Berlin

Re: Alle Zeilen in Kreuztabelle anzeigen

Beitragvon Joachim66 » 12. Jan 2017, 10:41

Nouba hat geschrieben:Du kannst alle Kunden und alle Produkte in einer Abfrage kombinieren und in der Kreuztabellenabfrage dann mittels Left-Join auf die tatsächlichen Daten verweisen. Bei 64 Produkten wäre aber das Ende der Fahnenstange erreicht.


Das habe ich nicht verstanden: Schon Marmeladenglas hat mit einem LEFT- und einem RIGHT-Join alle Daten kombiniert. Oder meinst du einen zusätzlichen Join? Wenn ja, wie???

Falls wir aneinander vorbei reden: Es würde genügen, dass keine Spalte mit leeren Daten angezeigt wird.

Übrigens: Es gibt in meinem konkreten Fall nur um ca 4-10 Produkte, mehr wird es wohl nie geben. Daher wäre es egal, ob es Spalten für alle Produkte gäbe, oder nur für solche mit Bestellungen. Hauptsache, die Spalte(!) für "Kunden ohne Bestellungen" wird nicht angezeigt.
Joachim66
 

Re: Alle Zeilen in Kreuztabelle anzeigen

Beitragvon Marmeladenglas » 12. Jan 2017, 19:00

Hi,
der Vorschlag von Nouba unterscheidet sich schon von meinem.
Er bildet zunächst ein kartesisches Produkt aus Kunde und Produkt. D.h. jedes Produkt wird mit jedem Kunden kombiniert.
Dies ist Grundlage für die Kreuztabellenabfrage.
Im Endergebnis zeigt sich dann die gewünschte Darstellung, ohne dass es eine Leer-Spalte für Kunden ohne Produkte, mit merkwürdigen Zeichen als Titel gibt. Auch werden so alle Produkte dargestellt, auch wenn sie noch nie bestellt wurden.

Code: Alles auswählen
TRANSFORM First(([txtDatum])) AS BestellDatum
SELECT QTemp.txtKunde
FROM (SELECT TblKunde.txtKunde, TblProdukt.txtProdukt, TblKunde.IDKunde, TblProdukt.IDProdukt FROM TblKunde, TblProdukt)  AS QTemp LEFT JOIN TblBestellung ON (QTemp.IDProdukt = TblBestellung.lngProdukt) AND (QTemp.IDKunde = TblBestellung.lngKunde)
GROUP BY QTemp.txtKunde
PIVOT Nz([txtProdukt]);
Marmeladenglas
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 16522
Registriert: 23. Jan 2008, 18:55

Re: Alle Zeilen in Kreuztabelle anzeigen

Beitragvon Joachim66 » 12. Jan 2017, 21:16

Marmeladenglas hat geschrieben:Hi,
der Vorschlag von Nouba unterscheidet sich schon von meinem.
Er bildet zunächst ein kartesisches Produkt aus Kunde und Produkt.

Ah, verstehe, das ist brillant! :D

Wie ich das verstehe, ist QTemp ja eine Unterabfrage vom Typ Snapshot oder so, womit es keine Zeile für Neueingaben mehr gibt. Deswegen verschwindet dann auch die Leerzeile, richtig?

Vielen Dank!!!
Joachim66
 


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: juvee und 14 Gäste