Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Schnittmenge innerhalb einer Tabelle

Begonnen von Petar91, September 04, 2017, 15:51:35

⏪ vorheriges - nächstes ⏩

Petar91

Hallo zusammen,

ich bin seit 2-3 Wochen Neuling bei Access. Allerdings hatte ich mal vor geraumer Zeit eine Vorlesung in Datenbank ( Vielleicht hilft es zum Verständnis  :) )

Mein Problemchen:
- nur eine Tabelle
- 2 Spalten: Erzeugnisse und Bausteine --> Einträge können in beiden Spalten mehr als 1x
                   vorkommen, da z.B. ein Erzeugnis A den Baustein 1 enthält. Ein Erzeugnis B
                   enthält ebenfalls den Baustein 1.

Ziel:
- Bestimmung der Anzahl an gleichen Bausteinen für zwei wählbare Erzeugnisse.
         Erzeugnis A ; Baustein 1
         Erzeugnis A ; Baustein 2
         Erzeugnis A ; Baustein 3
         Erzeugnis B ; Baustein 1
         Erzeugnis B ; Baustein 3
         Erzeugnis C ; Baustein 4
         Erzeugnis C ; Baustein 5

-Die Anzahl der gleichen Bausteinen bei Vergleich von Erzeugnis A und B wäre 2.
-Die Anzahl der gleichen Bausteinen bei Vergleich von Erzeugnis A und C wäre 0.

--> Als Resultat sollte es eine Zahl ergeben ODER optional vorstellbar wäre auch eine Abfrage,
      die mir die gemeinsamen Bausteine anzeigt.

Ist das möglich?


Vielen Dank Euch!

Petar

DF6GL

Hallo,


etwa so:

SELECT Tabelle1.Baustein, Count(Tabelle1.Erzeugnis) AS AnzahlvonErzeugnis
FROM Tabelle1 INNER JOIN Tabelle1 AS Tabelle1_1 ON (Tabelle1.Baustein = Tabelle1_1.Baustein) AND (Tabelle1.Erzeugnis = Tabelle1_1.Erzeugnis)
GROUP BY Tabelle1.Baustein

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Petar91

Hallo DF6GL,

danke für die Antwort. Hat mit ein bisschen probieren und verändert geklappt

Vielen Danl!

Petar91

#3
Hallo DF6GL,

hab leider doch wieder Probleme bekommen, da es doch nicht meine Aufgabenstellung gelöst hat (Habs leider nach der Euphorie erst heute festgestellt).
Deine Anfrage hat folgendes Ergebnis:

Baustein ; AnzahlvonErz
Baustein 1; 0
Baustein 2; 3
...
---> Es zählt defacto die Anzahl der Bausteinen, aber nur die allgemeine Anzahl. Allerdings benötige ich folgendes für die folgende Tabelle:

Erzeugnis A ; Baustein 1
         Erzeugnis A ; Baustein 2
         Erzeugnis A ; Baustein 3
         Erzeugnis B ; Baustein 1
         Erzeugnis B ; Baustein 3
         Erzeugnis C ; Baustein 4
         Erzeugnis C ; Baustein 5
         Erzeugnis D ; Baustein 1
         Erzeugnis D ; Baustein 2

1) Filtern nach Parametereingabe: " Bitte geben Sie das erste Erzeugnis an " und "Bitte geben Sie das zweite Erzeugnis ein"

Ergebnis der Filterung nach Erzeugnis A und D:

         Erzeugnis A ; Baustein 2
         Erzeugnis A ; Baustein 3
         Erzeugnis D ; Baustein 1
         Erzeugnis D ; Baustein 2

2)Zählen der Anzahl der gemeinsamen Bausteinen der gefilterteten Erzeugnissen A und D:

   --> Ergebnis wäre 1 gemeinsamer Baustein (Baustein 2)

Tabelle sollte dann so aussehen:

         AnzahlgemeinsameErzeugnisse
         1



//Anmerkung. Ich habe es geschafft dieses Ergebnis manuell zu erzeugen. D.h. ich habe erste eine Anfrage erstellt, die nach zwei Erzeugnissen filtert. Danach wurde diese Abfrage als Tabelle1 gespeichert. Darauf basierend erstellte ich eine Abfrage, die aus der Tabelle1 alle Datensätze liefert, bei denen Bausteine mehr als einmal auftauchen (D.h. der Baustein ist sowohl in Erz A und D). Die Anzahl der Datensätze (z.B. 1) liefert mir gewünschte Anzahl.

Ist diese Kombination bzgl. meiner ersten Abfrage zur Filterung und meiner zweiten Abfragen zum Zählen und Ausgeben von Bausteinen, die in zwei Erzeugnissen vorkommen, möglich?

Vielen Dank dir/euch!!!

Petar



Lachtaube

Hier ist ein SQLFiddle mit Deinen Daten, der sich 1:1 nach Access übertragen lassen solte.
Grüße von der (⌒▽⌒)

Petar91

Hallo Lachtaube,

erst ein Mal vielen Dank!!!

Anbei der Code mit meinen Bemerkungen und Fragen, da es leider noch nicht klappt.

SELECT t0.b AS Baustein
FROM   t t0
       INNER JOIN t t1                                   //1. Ich hab nur eine Tabelle mit Erzeugnissen und
                                                                        Bausteinen. Erzeuge ich dann einfach eine Kopie
                                                                        um die Schnittmenge zu bekommen?
               ON t0.b = t1.b
WHERE  t0.e = 'Erzeugnis A' AND                       //2. Hier würde ich gerne mit Parametern, die
                                                                          Abfrage flexibel gestalten (--> WHERE t0.e
                                                                          LIKE [Bitte Erz1) eingeben
       t1.e = 'Erzeugnis D';
       
-- zählen                                                       //3. Sind das 2 getrennte Abfragen oder kann man
                                                                          die als eine gestalten, da nach dem ;
                                                                          normalerweise Ende ist.
SELECT COUNT(*) AS AnzahlgemeinsameErzeugnisse
FROM (                                                         //4. Hier gibt es ein Problemchen bei mir in Access
                                                                          wegen der Klammer --> Ist es möglich FROM
                                                                          und danach SELECT zu verwenden
  SELECT t0.b                                                 
  FROM   t t0
         INNER JOIN t t1
                 ON t0.b = t1.b
  WHERE  t0.e = 'Erzeugnis A' AND
         t1.e = 'Erzeugnis D') x;                                //5. Das x ist dann fehl am Platz?


Danke dir!!

Lachtaube

Wie Du dem Beispiel entnehmen kannst, hat dieses auch nur eine Tabelle, die man aber beliebig oft in eine Abfrage einfügen kann. Zur Unterscheidung von Tabelleninstanzen muss man Alias-Namen einsetzen (im Bsp. t0 und t1).

Statt der fixen Vorgabe, kannst Du selbstverständlich Parameter einsetzen. In einer entwickelten Form der Datenbank würden diese Parameter durch Steuerelemente eines Formulars oder Funktionsergebnisse bestückt werden.

Ja, das sind zwei Abfragen, die jeweils eine Spalte als Resultat aufweisen. Bei gleicher Feldanzahl kann man Abfragen vereinigen. Ist also machbar - aber nicht unbedingt übersichtlich. In einem Formular würde man eher die Bauteile in einem Listenfeld und die Anzahl, wenn man sie den nicht mittels Auge überschauen kann, mittels Textfeld ausgeben.

SQL unterliegt festen Regeln und die zweite Abfrage ist ja, wie Du siehst, nur eine Abfrage auf die erste Abfrage - der Alias x ist notwendig und würde bei weglassen von Access durch so etwas wie [%$##@_Alias] ersetzt werden, was nicht unbedingt zum Verständnis beiträgt.

Du kannst die Geschichte auch aufdröseln. Erstelle jeweils eine Abfrage mit dem Bauteil als Feld und dem Erzeugnis als Parameter (unterschiedlich benennen), speichere die Abfragen und erstelle eine neue Abfrage, in der Du beide bfragen aufnimmst und über das Bauteil verknüpfst, weches Du aus einer der beiden Abfragen (egal welcher) als Feld ausgibst. Das ist die erste Abfrage. Erstelle auf Basis dieser Abfrage eine neue Abfrage und trage Anzahl(*) in eine Spalte der Feldzeile ein. Das wäre dann die zweite Abfrage.


Grüße von der (⌒▽⌒)

Petar91

Hallo nochmal,

Es hat super geklappt und zudem habe ich noch was gelernt.

Vielen Dank!!!!!!!!

Lachtaube

Freut mich Petar, dass ich helfen konnte.
Grüße von der (⌒▽⌒)