Neuigkeiten:

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

Mobiles Hauptmenü

Eine komplexe Ähnlichkeitsgrupierung in Access SQL ohne VBA möglich?

Begonnen von Kloso, November 07, 2016, 16:23:47

⏪ vorheriges - nächstes ⏩

Beaker s.a.

Hallo crystal,
Zitatdass die Struktur der Access-Anwendung des Thread-Starters nicht bekannt ist,
O.K., so hatte ich es nicht verstanden. Trifft aber trotzdem nicht, denn die Struktur
haben Josef und Eberhard ja schon gleich zu Beginn aufgezeigt.
Sie ist ja auch grundlegend für den Import und (vor allem wohl) die Weiterverarbeitung,
wozu Josef auch schon einen Ansatz gepostet hat. War somit eigentlich das einzige
Thema im Thread, zum Status quo also bekannt.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Kloso

Hallo an alle, ich bedanke mich sehr für die solch große Beiträge zu meinem Problem.

Crystal:
ZitatZu kompliziert? OK, gebe ich zu. Man muss zuerst etwas mit den Original-Exceldaten jonglieren. Aber so oder so ähnlich könnte es klappen. Es macht natürlich nur dann Sinn, wenn die Excel-Datei mit den Bezeichnungen und Synonyma relativ selten geändert wird...
Ja, die Synonyme Tabelle wird oft geändert und aktualisiert, da kommen auch neue Begriffe dazu. Darum wäre dein Vorschlag zwar möglich, aber zu umständlich zum aktualisieren.

Beaker:
Zitat255, um genau zu sein
Da würde dann wieder dieses Problem, was ich schon mal hatte auftauchen: http://www.access-o-mania.de/forum/index.php?topic=21835.msg125463#msg125463, dass ich WHERE, und JOIN IN nicht auf alle Spalten (Tabelle.*) beziehen kann sondern nur auf eine und bei mehreren SynonymeSpalten wäre es sehr umfangreich sie alle (im Code) aufzuzählen.

ebs17:
ZitatMit einer ordentlichen Datenstruktur
Ja. Das habe ich nun verstanden, dass es der Kernpunkt ist. Versuche das nun zu analysieren. Ob das in meinem Fall möglich ist.
ZitatAber man kann auch auf die eigentliche Fragestellung (Erstbeitrag: Ähnlichkeit) eingehen, irgendwo gibt es da ja Gründe für die ursprüngliche Formulierung.
Weil ich ursprünglich schon den Query fertig hatte (siehe mein erster Beitrag), jedoch waren dann synonyme wie hund = 1 und hundE = 3 in einer spalte untereinander und da habe ich halt zuerst den Gedanken gehabt, dies mit hilfe von (z.Bsp 75%tiger ähnlichkeit zu gruppieren) und Hund = 4 bekommen könnte, was aber nun völliger quatsch sei(unmöglich).

JosefP.:
ZitatDie Tabelle "Suchbegrifftabelle" enthält beispielsweise
Suchbegriff | Hauptbegriff (=Synonym-Gruppe)
Hund | Hund
Hunde | Hund
Rüde | Hund
Dackel | Hund
Das ist nun mein Anhaltspunkt an dem ich sage, dass sieht nun für mich realistisch aus. Jedoch muss ich dann meine Excel-Tabell komplett umstrukturieren und in zwei spalten dann machen Spalte1: Begriff Spalte2: Synonyme. Dann könnte man es ordentlich gruppieren und alle synonyme wären auf Spalte1, sprich, den Begriff grupiert.

crystal:
ZitatEs geht ja wohl eher darum, anhand der Synonyma eines Hauptbegriffs auf weitere Datenbestände innerhalb der Access-Anwendung, evtl. auch auf Daten einer Server-Datenbank zuzugreifen, oder? Wobei es wohl so ist, dass in diesen Datenbeständen der Hauptbegriff nicht vorhanden ist, so dass man dort nur über die Synonyma suchen kann.
Genau so sieht es aus. Ich habe eine ServerDatenbank die ich analysiere. Da tauchen in einer Spalte dann die begriffe auf die meist "anders" geschrieben werden(also wie synonyme). Mein Ziel ist es einfach die Häufigkeit dieses Begriffes (inkl. seine Synonyme) zu analysieren.

Da bleibt mir im Endeffekt nur die Variante von JosepfP klar.

Versuche nun mein Glück, schaue wie weit ich mit meinen schwachen Kenntnissen voran komme. Bedanke mich aber wirklich für so viel Mühe!!!
Viele Grüße Kloso

crystal

Hallo Kloso,

danke für deine ausführliche Antwort.

Bitte prüfe doch, ob es in der Server-Datenbank nicht doch ein Feld gibt, das eindeutig ist, egal welcher neuer Begriff (Synonym) eingegeben wird. Denn die Excel-Datei wird ja auch "irgendwie" aus den Daten der Server-DB erstellt, deshalb wird es die erforderliche Beziehung Hauptbegriff->Synonym dort vermutlich auch geben.

Ggf. könntest du die "Server-Datenbank-Administratoren" bitten, dir einen VIEW auf die Daten zu erstellen, in dem sowohl Hauptbegriff als auch Synonym enthalten ist. Das würde deinen Aufwand dann erheblich reduzieren...

Viel Erfolg anyway,
crystal

PS: Ich gehe mal davon aus, dass du nur beschränkten Zugriff auf die Server-Datenbank hast - alles andere wäre aus Sicht der Admins fahrlässig. Die Admins haben dir also einen oder mehrere Views auf die Server-Datenbank bereitgestellt (readonly), damit du damit werkeln kannst.

Da wäre es doch ein leichtes, diese Views so zu erweitern, dass du dein Vorhaben - schwups - umsetzen kannst, selbst wenn es sich um SAP handeln sollte...
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Kloso

Hallo crystal,

ZitatDenn die Excel-Datei wird ja auch "irgendwie" aus den Daten der Server-DB erstellt,
Leider nein, die Excel Datei ist von einer entstanden, der genau weiß nach was in der DB gesucht werden kann(was in der Server-DB dann als Eintrag auftaucht), und sich dann ungefähr die Frage gestellt hat-> welche synonyme könnte man haben, welche Tippfehler kann der User mal machen, und hat es in der Excel Tabelle hinterlegt, damit man dann eine etwas genauere Analyse auf bestimmte (Such)Begriffe machen kann.
Viele Grüße Kloso

crystal

Hallo Kloso,
also das ist ja schon irgendwie seltsam.
Das Server-System MUSS doch mit irgendwie eindeutigen Daten arbeiten (z.B. Produkt-Nummer), wenn dort ein neuer Datensatz angelegt wird. Oder können dort Datensätze "im Nebel" erstellt werden?

Wie werden denn Datensätze im Server-System zusammengeführt, in denen mal Hündin und mal Dackel steht, wobei sich beide auf denselben Hauptbegriff Hund beziehen?

Bitte frag doch mal genau bei den Admins nach.

Deine Aussage im letzten Posting würde bedeuten, dass die Server-DB letztlich unbrauchbar wäre, was ich mir allerdings nicht vorstellen kann. Nochmal: Wenn es dort möglich ist, Bezeichnungen frei einzugeben, wird es trotzdem ein Feld geben, in dem die "eigentliche" Referenz gespeichert ist oder anders gesagt ein Feld, anhand dessen es möglich ist, Datensätze mit unterschiedlichen Bezeichnungen als "zusammengehörend" zu identifizieren.

Vielleicht ist nur die Eingabe-Maske schlecht gebaut, so dass man das Feld "Hauptbegriff" nicht sieht, sondern nur das Freitext-Feld (Synonym). Dann würde es mich nicht wundern, dass ein "genervter" Mitarbeiter eine solche Excel-Tabelle händisch erstellt.

Bitte prüf das und lass uns wissen, wie es aussieht.

Grüße
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Kloso

Hallo crystal,

also ich habe gehofft ich schaffe es ohne ins Detail zu gehen :)

du musst es dir so vorstellen. Du gibts in google was ein - google listet dir das gesuchte auf. Ich bekomme in meiner Server datenbank zu sehen, was gesucht worden ist und zu welcher Zeit und wie viele Treffer es gibt. So eine Datenbank ist das. Darum jedes mal wenn jemand etwas in unserer Suche was sucht, bekomme ich es in meiner Datenbank.
Ich analysiere das. Ich analysiere sehr viel daraus, wie viele suchen es gibt, wie viele suchen nur ein Wort wie viele einen Satz und so weiter.
Es gibt aber bestimmte Sachen die gesucht werden. Eins davon ist genau das was ich am Beispiel mit den Hunden gemacht habe. Sagen wir mal es werden Tiere gesucht. Jemand gibt "Hund" ein und sucht in der von der Suchmaschine hinterlegten Servern nach dem Inhalt. Parallel ist da irgendwo im Kern der Suchmaschine ein Tool hinterlegt der mit Synonymen arbeitet. Dieser Tool braucht eine bestimmte Form einer Excel Tabelle mit synonymen die dann in das für das Tool formatierte Format konvertiert wird.
Ich greife mir einfach die für das Tool erstellte Excel Tabelle und versuche mit ihrer Hilfe die Suchen zu analysieren.

Habe schon alles was nur möglich ist erfolgreich analysiert. Nur bleibt mir halt nur noch dieser einfacher  (in Gedanken aber nicht im Prozess) weg die Suchbegriffe in abhängigkeit von excel zu analysieren.

Ich habe eigentlich schon folgendes gemacht. Vielleicht wird es dann einfacher:
- Ich habe schon mit einem tollen Query für den Monat xx ein gutes Ergebnis, der mir folgendes Liefert:

Ergebnis (mit dem Query) in Access:






SuchbegriffAnzahl
Hund3
Hunde2
Hund welpen1

Die original (excel)Synonym Tabelle:






BegriffSynonymeSynonymeSynonyme
HundHunde welpenDogsHunde
KatzeKatzenCatsCat
MausMäuseMauseMouse


Es wäre ja in etwa wie folgt:
Prüfe Spalte "Suchbegriff" mit der Tabelle Synonyme, achte auf die Spalten "Synonyme" und gib sie dann bei Spalte "Begriff" in der Ergebnisstabelle dazu. Schlielich gruppiere die Begriffe und zähle die Spalte "Anzahl" zusammen.






SuchbegriffAnzahlBegriff
Hund3Hund
Hunde2Hund
Hund welpen1Hund

Nun ist mein Ziel eigentlich einfach (egal ob in Acces oder exportiert in Excel):




SuchbegriffAnzahl
Hund6


Das wäre so das was ich mir vorstellen würde. Was sagt ihr, reicht da der Ansatz von JosefP?

Liebe Grüße
Viele Grüße Kloso

DF6GL

Hallo,

natürlich passt der Vorschlag von JosefP...


Du musst nur die Excel-Liste in eine (normalisiere) Access-Tabelle umsetzen (Wurde auch schon gezeigt):
ZitatBegriff Synonym
----------------------
Hund   Hund
Hund   Hunde
Hund   Welpen
Hund   Dogs
Katze  Katze
Katze  Katzen
Katze  Cats
Katze  Cat 
Maus  Maus
Maus  Mäuse
Maus  Mice
Maus  Mouse

und die Abfrage an die Namen anpassen.
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

Kloso

Gebe es eine einfachere möglichkeit diese excel tabelle wie davor beschrieben zu normalisieren ohne es per hand abzutippen?

ZitatDie original (excel)Synonym Tabelle:






BegriffSynonymeSynonymeSynonyme
HundHunde welpenDogsHunde
KatzeKatzenCatsCat
MausMäuseMauseMouse

Wahrscheinlich VBA mäßig, oder? Oder hat excel so eine Funktion?
Viele Grüße Kloso

DF6GL

Hallo,

es läuft ein ähnlich gelagerter Thread:

http://www.access-o-mania.de/forum/index.php?topic=21877.0
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

Beaker s.a.

Hallo,
ZitatIch greife mir einfach die für das Tool erstellte Excel Tabelle
Wenn da irgendwo eine Excel-Tabelle generiert wird, ist es da nicht möglich noch
eine zweite, für dich geeignete ("normalisierte") Excel-Tabelle zu generieren?
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Kloso

Hallo Beaker s.a.,
leider nein, das hatte ich auch schon probiert.

Aber ::)
Ich habe es nun super hinbekommen. Funktioniert genau wie es haben möchte. Super Super Super! Nur noch eine kleine optische Korrektur bekomme ich nicht hin. (bisschen weg von meinem Thema sondern nur auf SQL Sprache bezogen:)

Bei folgendem SQL Code:

SELECT [Tabelle1].[SpalteA], [Tabelle2].[Spalte1]
FROM [Tabelle1], [Tabelle2]
WHERE ([Tabelle1].[SpalteA] = [Tabelle2].[Spalte1])

UNION ALL

SELECT [Tabelle1].[SpalteA], [Tabelle2].[Spalte1]
FROM [Tabelle1], [Tabelle2]
WHERE ([Tabelle1].[SpalteA] = [Tabelle2].[Spalte2])

UNION ALL

SELECT [Tabelle1].[SpalteA], [Tabelle2].[Spalte1]
FROM [Tabelle1], [Tabelle2]
WHERE ([Tabelle1].[SpalteA] = [Tabelle2].[Spalte3]);

UNION ALL
...


Union All geht bis SpalteX.
Nun ist die Frage ob man es schöner kombinieren könnte. Es ändern sich ja hauptsächlich nur die "Spalte1,Spalte2,Spalte3..SpalteX". Ob man das Union umgehen könnte und stattdessen es irgendwie mit Komma oder And lösen könnte?

Viele Grüße
Viele Grüße Kloso

ebs17

Nein, anders kannst Du die UNION-Abfrage nicht schreiben. Entweder Du bist bei vielen Synonym-Spalten tippfleißig, oder aber Du setzt Dir in einer VBA-Schleife die gewünschte Anweisung zusammen.

Persönlich würde ich aber auf die UNION-Abfrage verzichten und eine neue Tabelle erstellen, da allerdings die Exceltabelle umformen:
Public Function PivotToList(ByVal NamePivotTable As String, _
                            ByVal NameListTable As String, _
                            ByVal NumberFirstMatrixField As Byte, _
                            ByVal NameTitleField As String, _
                            ByVal NameValueField As String, _
                            ByVal TypeValuefield As DataTypeEnum, _
                            Optional ByVal UseNullValues As Boolean = False, _
                            Optional ByVal IntoNewTable As Boolean = False) As Boolean
    On Error GoTo ErrHandler
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset
    Dim tdf As DAO.TableDef
    Dim fld As DAO.Field
    Dim sSQL As String
    Dim sConstantFields As String
    Dim bExistsTable As Boolean
    Dim i As Long

    Set dbs = CurrentDb

    bExistsTable = TableExistsDAO(dbs, NameListTable)
    If IntoNewTable Then
        If bExistsTable Then dbs.TableDefs.Delete NameListTable
    End If

    Set rst = dbs.OpenRecordset(NamePivotTable, dbOpenSnapshot)
    With rst
        If Not bExistsTable Or IntoNewTable Then
            ' Listtabelle neu erstellen
            Set tdf = dbs.CreateTableDef(NameListTable)
            For i = 0 To NumberFirstMatrixField - 2
                Set fld = tdf.CreateField(.Fields(i).Name, .Fields(i).Type)
                tdf.Fields.Append fld
                sConstantFields = sConstantFields & "[" & .Fields(i).Name & "], "
            Next
            Set fld = tdf.CreateField(NameTitleField, dbText)
            tdf.Fields.Append fld
            Set fld = tdf.CreateField(NameValueField, TypeValuefield)
            tdf.Fields.Append fld
            dbs.TableDefs.Append tdf
            RefreshDatabaseWindow
        End If

        ' Inhalte übertragen
        For i = NumberFirstMatrixField To .Fields.Count - 1
            sSQL = "INSERT INTO " & NameListTable & " (" & sConstantFields & "[" & _
                   NameTitleField & "], [" & NameValueField & "])" & _
                   " SELECT " & sConstantFields & "'" & .Fields(i).Name & "', [" & _
                   .Fields(i).Name & "] FROM " & NamePivotTable
            If Not UseNullValues Then
                sSQL = sSQL & " WHERE [" & .Fields(i).Name & "] IS NOT NULL"
            End If
            dbs.Execute sSQL, dbFailOnError
        Next

        .Close
    End With

    '    ' Beispiel für ein Setzen eines zusammengesetzten Index
    '    sSQL = "CREATE INDEX NachnameVorname ON Listtabelle(Nachname, Vorname)"
    '    dbs.Execute sSQL, dbFailOnError

    Set rst = Nothing
    Set dbs = Nothing

    PivotToList = True

Exit_Function:
    Exit Function
ErrHandler:
    MsgBox "Fehler: " & vTab & Err.Number & vbCrLf & Err.Description
    Resume Exit_Function
End Function

Public Function TableExistsDAO(pDb As DAO.Database, _
                               ByVal psName As String) As Boolean

    Dim s As String

    On Error Resume Next
    s = pDb.TableDefs(psName).Name
    TableExistsDAO = (Err.Number = 0)
End Function


Die Tabelle wird wegen "Fertigkeit" in der folgenden Berechnung schneller sein, außerdem lassen sich Felder indizieren, was der Performance einen zusätzlichen Schub geben kann.
Mit freundlichem Glück Auf!

Eberhard

crystal

Hallo nochmal,
wie wäre denn folgender Vorschlag:

1. du verknüpfst die Excel-Datei mit Access
2. dadurch kannst du auf die verknüpfte Tabelle so zugreifen, als wäre sie eine Access-Tabelle
3. sagen wir die Excel-Tabelle heißt etab mit den Feldern haupt, syn1, syn2...synx
4. jetzt könntest du eine Union-Abfrage erstellen (Name uquery):
select haupt, syn1 as syn from etab
union
select haupt, syn2 as syn from etab where syn2 <> ""
union
select haupt, syn3 as syn from etab where syn3 <> ""
...
union
select haupt, synx as syn from etab where synx <> "";
5. diese Abfrage uquery kannst du dann in deiner eigentlichen Suche angeben (Bsp.: du suchst nach Hund):
select uquery.haupt, uquery.syn, <irgendwas> from uquery, <irgendwo>
where <suchfeld>
in (select haupt, syn from equery where haupt="Hund")
group by syn;

Damit bleibt die externe Excel-Datei unangetastet (sie ändert sich ja) und sie braucht nicht in Access kopiert zu werden. Sie hat dann leider keinen Index, aber das ist vielleicht zu verschmerzen - je nach Größe der Datei.

uquery ist dann eine virtuelle Tabelle, die nur so lange existiert, wie die eigentliche Abfrage läuft. Deine Excel-Datei braucht nicht umstrukturiert werden, so dass du immer auf die aktuelle Version zugreifst.

Die Performance wird eher etwas schlecht sein; schlecht performant ist aber nur der Teil, der die IN-Tabelle zusammenbaut. 

Möge ein Spezialist sich das anschauen und kommentieren, bevor du es probierst.

lg
crystal



Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

ebs17

ZitatDamit bleibt die externe Excel-Datei unangetastet (sie ändert sich ja)
Wenn zu den x Synonym-Spalten weitere hinzukommen, erfährt es die UNION-Abfrage nicht, und die nachfolgende Verarbeitung auch nicht. Ist das beabsichtigt?

Strukturprobleme löst man besser grundlegend, statt dass da ein Programmierer alle Entwicklungen im Auge behalten und nachprogrammieren muss, es sei denn, der Programmierer muss mangels richtiger Aufgaben beschäftigt werden.

ZitatDatei unangetastet
Eier werden von Natur aus mit Kalkschale und vom Menschen mit Pappe-Umverpackung geliefert. Was passiert, wenn man Rühreier machen will?
Mit freundlichem Glück Auf!

Eberhard

crystal

Sorry liebe Mods,

ich muss doch kurz auf den unsinnigen Post von Eberhard antworten.

1. Es gibt keine fertigen Programe oder Anwendungen. Man muss immer irgendwo nachbesern oder erweitern.
2. Wenn Kloso bei Umsetzung meiner Idee x ausreichend groß wählt, wird das schon eine Weile funktionieren. Ansonsten muss er dann nur einen oder mehrere Unions hinzufügen. Einfache Sache.
3. Deine Beispiele aus der "realen Welt" sind eigentlich fast immer skurril, unpassend und unverständlich. Lass es doch und kommentiere einfach nur sachlich und fachlich fundiert.

lg
crystal

Im Übrigen habe ich meine Idee ja nicht als die Lösung per se dargestellt, sondern allenfalls als Alternative, die von Kloso - weil ohne VBA - vielleicht einfacher nachvollzogen werden kann...
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...