DatensatzGruppen vergleichen

Hi
Ich suche eine Abfragemethode, mit der ich Datensatzgruppen vergleichen kann.
Also:

Nehmen wir ein Beispiel TBAdressen

Datensatz Gruppe :

Felder: Name | VorName | AdrNr | Stadt | GruppenNr

2 x Huber Hans 1 Duisburg 1
1 x Fitz Willi 2 duisburg 1
1 x Franz Gans 3 Köln 1

Ich suche nun alle Datensatzgruppen, die != 1 sind, aber ansonsten die gleichen Positionen haben.

Ich glaube zwar nicht daran, daß es jemand weiß(ich würde täglich zu ihm beten), aber die Verzweiflung treibt mich…

freudigst Airdahl

Hi,

ein komisches Beispiel, aber sicher lösbar!
Kannst Du die Daten etwas besser aufbereiten?

Danke

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

DatensatzGruppen?
Hi Airdahl,

mir ist in 35 Jahren IT noch keine Datensatzgruppe begegnet. Aus dem Beispiel erschließt sich mir der Zusammenhang auch nicht. Was bedeutet „!=1“? Vielleicht bekomst Du mehr Antworten, wenn Du Ausgangsdaten und gewünschtes Ergebnis nebeneinander stellst.

Gruß Ralf

Hi!

Das Problem scheint mir in der Tat nicht so ganz einfach - zumindest innerhalb SQL - lösbar.

Ich habe das Problem ungefähr so verstanden. Wenns wir uns von der Tabelle lösen, in der versch. Adressen inkl. Adressdetails mit Gruppennummern zusammen gespeichert sind und etwas abstrahieren, komme ich auf folgende Problemstellung. Wir haben eine Menge von Werten, die jeweils einer Gruppe zugeordnet ist, in folgender Art (wenn man die Adressdetails bspw. ein einer seperaten Tabelle speichert und stattdessen die Beziehung zur Gruppe mittels einer Adress-ID einzeln hält - Thema Normalformen !):

Tabelle adressengruppen
adress_nr, gruppen_nr
1, 1
1, 1
2, 1
3, 1
2, 5
1, 5
4, 5
2, 5
1, 3
2, 3
3, 3
1, 4
1, 4
2, 4
3, 4

Nun stellt sich ja die Frage, wie man z.B. feststellt, dass die Menge der Adressnummern die der Gruppennummer 1 zugeordnet sind, identisch ist mit der Menge der Adressnummern die der Gruppennummer 4 zugeordnet sind, oder? So habe ich zumindest das Problem verstanden.

Man muss also Mengen von Zahlen als identisch dann erkennen, wenn quasi alle enthaltenen Elemente identisch sind.

Ad hoc fällt mir dazu nur eine Art Funktion ein, die für eine Gruppe eine eindeutige Zahl, ähnlich einer "Hashfunktion2 bildet. In oracle könnte man folgendes Benutzen (obere Bsptabelle als Vorlage):

SELECT DISTINCT t2.gruppen_nr,
( SELECT sum(t1.adress_nr*power(( select max(adress_nr) from adressengruppen), rownum)) pruef_id
FROM adressengruppen t1
WHERE t1.gruppen_nr = t2.gruppen_nr
) id_id – ordnet Zifferngruppe eindeutigen Wert zu
FROM adressengruppen t2;

Zwei Gruppen sind dann gleich, wenn sie die gleiche pruef_id besitzen.

SQL-Syntax ist oracle. In ANSI-SQL ist sowas natürlich nicht möglich.

Am effizientesten erscheint mir für sowas eher ein Programm.

Gruss

Johannes

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi nochmal, habe es nicht ganz eindeutig rübergebracht…

Die 1 ist die Gruppennummer.
Ich suche eine weitere oder alle Gruppen deren Einträge der der Gruppe 1 entsprechen.
Das heißt, ich suche Gruppen deren Positionen auch Adressen enthalten, die denen der Gruppe 1 entsprechen

Felder: Name…|.VorName…|…Stadt…|…GruppenNr

2 x…Huber…Hans…Duisburg…1
1 x…Fitz…Willi…duisburg…1
1 x…Franz…Gans…Köln…1

Das Beispiel mit den Adressen ist frei gewählt, mein eigentliches Problem bezieht sich auf Lagerspezifische Einheiten, die nicht die gleiche ID haben.

Meine Ergebnismenge sollte also aus allen Adressgruppen bestehen in denen auch die Einträge wie in Gruppe 1 vorkommen, z.B.

1 x…Franz…Gans…Köln…23
1 x…Fitz…Willi…duisburg…23
2 x…Huber…Hans…Duisburg…23

Gruppe 1 und Gruppe 23 wären also nach meinen Kriterien gleich, weil die die gleichen Einträge mit gleichen Anzahlen hätten.

@Johannes, Dein vorschlag ist schon ganz gut, kann aber nicht so ohne Weiteres umgesetzt werden, da ich mich nicht auf die AdressId’s beziehen kann, sondern den Vergleich über die Anzahl, Name, Vorname und Stadt machen muß.

zur Info: ich bewege mich auch im Oracle-Sql-Bereich
mfg und Danke schonmal

Hi!

Wenn Du eine Zuordnung einer einzelnen Adresse zu einer eindeutigen Nummer hinbekommen würdest (z.B. mittels temporärer Abbildungstabelle), dann kannst Du die Lösung benutzen. Wäre auch bzgl. der vorhandenen Redundanz zu empfehlen. Die Adressen sind ja mehrfach in der Tabelle gespeichert.

Kleines Bsp.:
create sequence temp_new_seq;

create table temp_address_table as
select temp_new_seq.nextval address_id, Name, VorName, Stadt from
( select distinct Name, VorName, Stadt from xyz_table);
–> Gleiche Adressen eindeutig einer Zahl zuordnen.

Dann eine bereinigte Abbildungstabelle anlegen:

create table temp_mapping_table as
select x.address_id, gruppennummer
from xyz_table x, temp_address_table address
where x.name = address.name
and x.vorname = address.vorname
and x.stadt = address.stadt;

Nun hast Du in der Tabelle temp_mapping_table sie reine Beziehung von Adressen und Grupennummern gespeichert. Dadurch die die Abbildung der Adressen auf eine eindeutige Nummer erheblich einfacher.

Gruss

Johannes

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]