Access Daten auswerten
Hallo, vielleicht kann mir jemand hier helfen =)
wahrscheinlich ist es ein ganz einfaches problem, aber alle meine ansätze bringen irgendwie nur mangelhafte ergebnisse...
ich habe eine tabelle mit Kundendaten und Kundenherkunft. Darin sind 1700 unterschiedliche Herkünfte eingetragen (omg) also z.b. blabla Zeitung 1, Internet, Blabla Zeitung 2 usw.... also worüber der erste Kontakt hergestellt wurde bzw. der Kunde Kenntnis von dem Produkt erhalten hat.
ich möchte:
diese ergebnisse gruppieren (alle Zeitungen zusammen etc)
und dann ausgeben. Einzige Möglichkeit die ich selbt hinkriege ist pro einzelnem Parameter (Also eine "Zählabfrage" für alles mit Zeitung z.B., gibt dann ein Feld aus mit dem Wert)
Geht das nicht auch einfacher/kompakter?
Also z.B. wie
SELECT Count(t_kunde.kun_id) AS Anzahlvonkun_id
FROM t_kunde
GROUP BY t_kunde.kun_herkunft
HAVING (((t_kunden.kun_herkunft) Like "*Zeitung*"));
aber dass er mir dann halt nicht alle unterschiedlichen Zeitungen auflistet sondern das automatisch gruppiert?
Und das ganze dann auch noch für alle gruppierungen in einer Abfrage? Das wird doch sicherlich möglich sein.
Ich will dann später mit dieser Abfrage weiterarbeiten in dem Sinne, wer von diesen Kunden das Produkt dann auch gekauft hat (via Tabelle Bestellungen)
Hab wirklich versucht mich schlau zu lesen aber das hat leider nichts gebracht ;) Für Hilfe wäre ich sehr dankbar!
Antwort schreiben
Antwort 1 von RaHi vom 03.08.2022, 21:15 Options
Hallo shafty,
kannst du vielleicht mal mit Testdaten (z.B. 3 Kunden K1, K2 und K3) und der Kundenherkunft (blabla Zeitung 1, Internet, Blabla Zeitung 2) zusammenstellen und dann notieren, wie das Ergebnis aussehen soll?
Evtuell hilft die aber auch schon folgende Abfrage weiter
SELECT Count(t_kunde.kun_id) AS Anzahl, t_kunde.kun_herkunft
FROM t_kunde
GROUP BY t_kunde.kun_herkunft;
Gruß
Ralf
Antwort 2 von shafty vom 04.08.2022, 09:20 Options
danke für deine antwort RaHi
soweit hatte ich es aber schon probiert, dann listet er mir das nach dem schema
kun_id kun_herkunft
2 Zeitung 1
50 Zeitung 2
100 Internet
7 Zeitung 3
...
Ich möchte aber gerne: dann z.B. gruppieren nach Zeitung*
kun_id kun_herkunft
59 Zeitung
100 Internet
...
Antwort 3 von shafty vom 04.08.2022, 11:20 Options
also momentan fällt mir nix schlaueres ein als für jede gruppe eine eigne abfrage zu erstellen die dann den gesamtwert ausgibt... und dann führe ich das irgendwie in einem formular zusammen oder so.... aber schön ist das nicht oder xD
SELECT Count(t_kunde.kun_id) AS Anzahlvonkun_id
FROM t_kunde
WHERE (((t_kunde.kun_herkunft) like "zeitung*"));
p.s. sorry übrigens für die nichtssagende threadüberschrift ^^
Antwort 4 von shafty vom 04.08.2022, 12:03 Options
so habe jetzt grade gemerkt, dass das
Zitat:
für jede gruppe eine eigne abfrage zu erstellen die dann den gesamtwert ausgibt... und dann führe ich das irgendwie in einem formular zusammen oder so
nicht funktioniert! Fehlermeldung ... kann die werte nicht verbinden erstellung Formular unmöglich in etwa =(
jetzt bin ich völlig ratlos
Hi,
also Du könntest noch eine Tabellenspalte namens HID oder so (Herkunfts-ID oder auch Herkunfts-Kategorie) einfügen, dann trägst Du bei allen Zeitungen eine 1 ein, bei Internet eine 2, bei Flyern eine 3 usw. Bei Internet-Zeitungen musst Du Dir dann überlegen was Du machst ;-)
Aber dann könntest Du über diese HID einfach zählen und nach Herkunft(-ID) abfragen.
mfg, sup2010
Antwort 6 von shafty vom 04.08.2022, 14:50 Options
vielen dank für deine antwort, dass ist eine super idee!!
gibt es jetzt vielleicht noch eine möglichkeit das zu automatisieren? (per UPDATE oder so)
denn es handelt sich wie gesagt um 20000 datensätze mit rund 1700 unterschiedlichen "herkunft" angaben (total bescheuert...) naja und da würde ich gern irgendwie gruppieren
zeitung, abendblatt, bild, FAZ, ... *zeitung* kriegt ne 1 oder so usw...
Hi,
ja, das habe ich befürchtet und mich deshalb mit einem UPDATE - Statement zurückgehalten...
Wenn die Spalte Herkunft bei Zeitungen immer "Zeitung" enthalten würde, dann wäre es sicher recht schnell erledigt. Aber wie es aussieht, steht da eben "Bild", "FAZ", "Welt am Sonntag", Süddeutsche" etc. Ohne Kenntnis, was da genau steht ist es für mich nicht ganz einfach da konkrete Befehle zu nennen. Aber im Prinzip so:
UPDATE deineTabelle SET HID=1 WHERE herkunft='bild';
statt bild dann eben andere Bezeichner einsetzen...
UPDATE deineTabelle SET HID=1
WHERE herkunft='bild'
or herkunft='FAZ'
or herkunft='Welt am Sonntag'
or...;
sollte funktionieren...
Antwort 9 von shafty vom 04.08.2022, 15:37 Options
ja, dass wird sicherlich funktionieren, aber wie mache ich weiter?`
also update set hid = 1 für xxx or yyyy or zzz
update set hid = 2 für aaa or bbb or ccc
usw....
ist das möglich? per wenn /dann oder irgendwie anders?
Antwort 10 von shafty vom 04.08.2022, 15:42 Options
ich glaub ich habs:
UPDATE tabelle SET tabelle.hid= IIf([kun_herkunft] like "Internet*","1",IIf([kun_nachweis] = "Zeitung","2"));
scheint zu funktionieren =)
Hi,
Deine Frage aus A9 verstehe ich nicht ganz.
Wenn Du es so machst wie in A8, dann musst Du die Statements eben so ausformulieren, dass alle Herkünfte abgedeckt werden.
Eigentlich wäre es glaube ich sogar besser, wenn Du eine eigene Tabelle Herkunft hättest mit den Spalten ID, Herkunft, Kategorie. Id wäre dann der Primary key, unter Herkunft sind die verschiedenen Quellen eingetragen und bei Kategorie würde dann jeweils Zeitung, Internet etc drin stehen.
Dann würde in Deiner Kundentabelle unter Herkunft die ID aus der Tabelle Herkunft stehen. Wenn sich dann der Name einer Zeitung oder einer anderen Quelle ändert, dann müsstest Du nur den jeweiligen Eintrag in der Herkunftstabelle ändern und nicht die ganze Kundentabelle ändern/updaten.
Antwort 12 von shafty vom 04.08.2022, 16:10 Options
Zitat:
Eigentlich wäre es glaube ich sogar besser, wenn Du eine eigene Tabelle Herkunft hättest mit den Spalten ID, Herkunft, Kategorie. Id wäre dann der Primary key, unter Herkunft sind die verschiedenen Quellen eingetragen und bei Kategorie würde dann jeweils Zeitung, Internet etc drin stehen.
Dann würde in Deiner Kundentabelle unter Herkunft die ID aus der Tabelle Herkunft stehen. Wenn sich dann der Name einer Zeitung oder einer anderen Quelle ändert, dann müsstest Du nur den jeweiligen Eintrag in der Herkunftstabelle ändern und nicht die ganze Kundentabelle ändern/updaten.
Damit hast du sicherlich recht, aber ich kann nicht auf diese Weise in die gegebene Tabelle eingreifen. (mir liegt nur ein Access-Export vor, letztendlich werden die Daten in ein andere dbms eingetragen auf dass ich keinen zugriff habe)
vielleicht noch einmal ganz kurz und knapp: ich möchte auswerten, wieviel kunden aus welchem bereich "kommen", dabei ist es natürlich schwachsinnig 1700 herkünfte zu haben, deswegen wollte ich das ganze ein bißchen kategorisieren, d.h. dass die von Hand eingebenen herkünfte eingeteilt werden in die einzelnen oberbereiche.
würd das halt gern irgendwie anlegen für einen großteil, damit man diese abfrage später auch mal wieder ausführen kann. alles was nicht reinpasst (also auch später neu hinzugefügte Eingaben für die nix definiert war) kommt dann halt in einen Bereich "andere" oder so, das wäre nicht so schlimm
mein ansatz oben scheint irgendwie auch nur bei zwei If bedingungen zu funktionieren, bei der dritten krieg ich ne fehlermeldung.
ich kann natürlich jetzt das ganze auch einfach von hand eintragen einmal und dann zählen wenn es so doch viel komplizierter ist...
Antwort 13 von shafty vom 04.08.2022, 16:13 Options
Zitat:
mein ansatz oben scheint irgendwie auch nur bei zwei If bedingungen zu funktionieren, bei der dritten krieg ich ne fehlermeldung.
omg hatte nur ne klammer vergessen...
mit
select count(*) from t_kunde where HID=1;
könntest Du zählen, wieviele Kunden es gibt, deren Herkunft 1 (=zB Zeitungen) ist...
Antwort 15 von shafty vom 04.08.2022, 16:52 Options
ich weiß.
mein problem ist einfach momentan wie ich jetzt erstmal die 1 zuweise. mein ansatz oben funktioniert doch nicht, weil man anscheinend nicht unbegrenzt viele IF... kombinieren kann.
wie gesagt, ich kann es nicht ändern dass diese werte da nunmal so drin stehen (x verschiedene Zeitungen) ich will es nur auswerten und es dafür irgendwie kategorisieren und das - wenn möglich nicht ganz von hand
Also ich bin auch nur DB-Anfänger bzw allenfalls fortgeschrittener Anfänger. Ausserdem benutze ich Access nicht, sondern frage direkt über den MySql-Server an der Konsole ab.
Durch Deine Aussagen weiss ich jetzt nicht genau, ob Du z.B. die Spalte HID hinzufügen darfst oder sie hinzugefügt hast oder nicht.
Falls Du sie hinzugefügt hast, würde mir momentan nichts besseres einfallen, als für jede einzelne HID ( = Kategorie) ein entsprechendes UPDATE-Statement zu formulieren, dass möglichst viele Herkunftsarten abdeckt.
Da ich die jeweiligen Einträge in Herkunft nicht kenne, ist es nicht einfach Dir ein garantiert funktionierendes Statement zu geben.
Ich würde es also für HID 1 (Zeitungen) so machen:
UPDATE t_kunde SET HID=1 WHERE kun_herkunft='FAZ' or kun_herkunft LIKE '%zeitung%' or kun_herkunft LIKE '%blatt' ; ... (<- nach Bedarf erweitern)
Damit würden schonmal alle Einträge mit "FAZ", alle Einträge mit "zeitung" und alle Einträge die auf "blatt" enden (also Tagblatt, Abendblatt etc) auf 1 in HID gesetzt werden. Dieses Update-Statement könntest Du jetzt so erweitern, dass möglichst viele Zeitungen upgedatet werden. Den Rest könnte man dann vielleicht per Hand updaten.
Dann würde ich das Update-Statement für HID=2 (=Internet) anwenden, usw.
Ich hätte zwar noch andere Ideen, aber ich weiss nicht ob die funktionieren und falls doch wie, und ob das für Dich aufgrund Deiner DB-Struktur überhaupt anwendbar wären.
Wenn Du die Spalte HID nicht einfügen darfst/kannst, dann kannst Du Dir vielleicht eigene Tabellen erstellen, die eine Verbindung zur Original-DB aufnimmt, die Einträge einliest und die Du dann entsprechend für Deine Auswertungszwecke nutzen kannst.
mfg, sup2010
Antwort 17 von RaHi vom 04.08.2022, 22:10 Options
Hallo Shafty,
hier eine Billigvariante ohne eine Änderung an deinen Daten, falls du wirklich so Herkünfte wie Zeitung 1, Zeitung 2 usw gruppieren willst. Ich gehe dabei von Namensgleichheit bis zum ersten Leerzeichen aus:
SELECT Sum(t_kunde.Kunde_id) AS SummevonKunde_id, Left([Kun_herkunft],IIf(InStr([Kun_Herkunft]," ")>0,InStr([Kun_Herkunft]," "),999)) AS Ausdr1
FROM t_kunde
GROUP BY Left([Kun_herkunft],IIf(InStr([Kun_Herkunft]," ")>0,InStr([Kun_Herkunft]," "),999));
Das liefert dir dein Ergebnis aus A2. Der andere Ansatz von supporter2010 geht in die richtige Richung. Die Anzahl der Herkünfte wird ja nicht 20.000 betragen. Wenn dies übersichtlich ist, erstellst du dir eine weitere Tabelle "Herkunft" mit den Feldern Herkunft (text) und Gruppe (text) und fügst alle Herkunftsbezeichnungen ein und ordnest die Gruppedefinitonen zu (z.B. "Zeitung", "Internet). Dann kommst du mit der Abfrage:
SELECT Sum(t_kunde.Kunde_id) AS SummevonKunde_id, Herkunft.Gruppe
FROM Herkunft RIGHT JOIN t_kunde ON Herkunft.Herkunft = t_kunde.Kun_herkunft
GROUP BY Herkunft.Gruppe;
weiter. Hast du Herkunftsbezeichnungen vergessen, werden diese auch summiert, jedoch ohne Gruppenbezeichnung (right join).
Warum du allerdings die IDs summierst, statt zählst, muss du mir mal erklären.
Gruß
Ralf
Antwort 18 von shafty vom 06.08.2022, 15:22 Options
Danke für die Antworten.
Auch deine Antwort Rahi traf es leider nicht ganz: Dadurch dass jeder in das Feld irgendetwas eingeben konnte, gab es keine "regeln" wie der Inhalt aufgebaut ist.... allein schon weil z.B. der eine "FR" schreibt, der andere "Frankfurter Rundschau" etc.... alle Möglichkeiten dass irgendwie automatisiert zu kategorisieren stieß irgendwann an seine grenzen. Nur mit sql ist das wohl nicht machbar.
Ich hab mir jetzt letztendlich die Mühe gemacht allen einzelnen Werten eine Kategorie zuzuweisen, und diese dann zu zählen. Des weiteren habe ich den Vorschlag gemacht, dass doch in Zukunft diese Eingabe nur noch per Kombifeld mit einigen Auswahlmöglichkeiten möglich sein sollte, damit das ganze in Zukunft einfacher wird.
Antwort 19 von Marie vom 07.08.2022, 19:40 Options
Hallo Shafty,
habe leider eben erst deine Frage gelesen, weil schon so zahlreiche Antworten da waren hab ich nicht früher reingeschaut.
Zitat:
mein problem ist einfach momentan wie ich jetzt erstmal die 1 zuweise. mein ansatz oben funktioniert doch nicht, weil man anscheinend nicht unbegrenzt viele IF... kombinieren kann.
Das geht ganz einfach und unkompliziert:
Du legst Dir eine externe Datenbank mit einem Schlüsselverzeichnis an. In Dieser Datenbank hast Du Deine Kategorien, wie Du sie haben möchtest und gleichzeitig kannst Du auch die einzelnen Zeitungen zum Beispiel einlesen und umbennen, damit sie einheitliche Bezeichnungen haben. Du hast also in deiner externen DB zum Beispiel die Spalten
ID Bereich Textkorrekt
1 Zeitung FAZ
2 Zeitung Welt
oder wie auch immer Du es haben willst (so wie Du es jetzt in deinem Kombifeld vorgibst), dann legst Du eine Tabelle "Schlüssel" mit den Spalten
Bereich Textkorrekt textunbekannt
an.
Jetzt durchläufst du per Code eine Abfrage, wo Du die unbekannten Kürzel alle gruppiert drin hast, und vergibst dann für jedes Kürzel per Mausklick eines aus deinem Kombifeld und hängst das an deine Schlüsseltabelle an. Die sieht dann zum Beispiel so aus:
Bereich Textkorrekt textunbekannt
Zeitung FAZ Frankurter
Zeitung FAZ Fr. Allg. Zeitung
Zeitung FAZ frankf. Allg.
Zeitung FAZ Frankurter Allg.
usw. Danach hast Du für tausende von Abkürzungen nur eine einzige Aktualisierungsabfrage:
Du durchläufst sämtliche Datensätze und ersetzt den Ausdruck aus der Spalte textunbekannt mit dem Ausdruck Textkorrekt. Musst halt zum Verschlüsseln eine Messagebox anzeigen mit allen in Frage kommenden Möglichkeiten (Deine Kombibox) und alle vorkommenden Abkürzungen an deine Tabelle anhängen.
Du kannst natürlich dann genausogut jedem seine dämliche Abkürzung lassen und für Deine Statistik trotzdem die Ergebnisse oder Summen aus deiner Spalte "Textkorrekt" entnehmen.
Hoffe ich habe mich verständlich genug ausgedrückt, wenn nicht frag bitte nochmal nach.
gruß Marie