Hallo zusammen,
ich hänge mal wieder an einer Abfrage.
Nötige Tabellen sind folgende:
Tabelle einheit
Tabelle kundenCode:einheitnummer, kundennummer
In einer Einheit können mehrere Kunden sein.Code:kundennummer, filiale
Nun zu meinem Problem:
Ich brauche alle Einheiten, die Kunden mit unterschiedlichen Filialen beinhalten:
So weit so gut :-)Code:select distinct a.einheitnummer from einheiten a inner join kunden b on a.kundennummer = b.kundennummer where a.einheitnummer in (select distinct b.einheitnummer from kunden a inner join einheiten b on a.kundennummer = b.kundennummer group by 1 having count(distinct a.filiale > 1)
Nun hätte ich aber die Abfrage gerne so weit eingeschränkt, dass z.B. alle Einheiten aufgelistet werden, bei denen mindestens 1 Kunde der Filiale 1 zugeordnet ist.
Gruss
Toni
PS: Am Start ist PG 8.2.6 :-(
wer bis zum hals in der scheisse steckt, der sollte den kopf nicht hängen lassen
Code:test=*# select * from einheiten ; einheitnummer | kundennummer ---------------+-------------- 1 | 1 1 | 2 1 | 3 2 | 1 2 | 2 (5 rows) test=*# select * from kunden; kundennummer | filiale --------------+--------- 1 | 1 1 | 2 1 | 4 2 | 2 (4 rows) test=*# select distinct on (a.einheitnummer) a.*, b.filiale from einheiten a right join kunden b on a.kundennummer=b.kundennummer where b.filiale=1; einheitnummer | kundennummer | filiale ---------------+--------------+--------- 1 | 1 | 1 2 | 1 | 1 (2 rows)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Hm...
vielleicht hab ich mich schlecht ausgedrückt.... oder ich kapier die Lösung nicht.
Also in eine Einheit können mehrere Kunden, allerdings kann jeder Kunde nur in eine Einheit.
Nochmal Beispiel:
Code:test=*# select * from einheiten ; einheitnummer | kundennummer ---------------+-------------- 1 | 1 1 | 2 1 | 3 2 | 4 2 | 5 3 | 6 3 | 7 4 | 8 4 | 9Code:test=*# select * from kunden; kundennummer | filiale --------------+--------- 1 | 1 2 | 1 3 | 2 4 | 3 5 | 3 6 | 1 7 | 3 8 | 4 9 | 5Ich möchte also alle Einheitennummern, die Kunden mit unterschiedlichen Filialen beinhalten, bei denen mindestens ein Kunde der Filiale 1 zugeordnet ist.Code:test=*# select meine richtige abfrage; einheitnummer --------------- 1 | 3 |
wer bis zum hals in der scheisse steckt, der sollte den kopf nicht hängen lassen
Das ist faktisch meine erste Abfrage, nur daß ich da zum nachvollziehen mehr Spalten angezeigt habe. Aber sie paßt auf eine Daten und liefert das gesuchte Resultat. so what?Code:test=*# select * from einheiten ; einheitnummer | kundennummer ---------------+-------------- 1 | 1 1 | 2 1 | 3 2 | 4 2 | 5 3 | 6 3 | 7 4 | 8 4 | 9 (9 rows) test=*# select * from kunden; kundennummer | filiale --------------+--------- 1 | 1 2 | 1 3 | 2 4 | 3 5 | 3 6 | 1 7 | 3 8 | 4 9 | 5 (9 rows) test=*# select distinct on (a.einheitnummer) a.einheitnummer from einheiten a right join kunden b on a.kundennummer=b.kundennummer where b.filiale=1; einheitnummer --------------- 1 3 (2 rows)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Das ist faktisch meine erste Abfrage, nur daß ich da zum nachvollziehen mehr Spalten angezeigt habe. Aber sie paßt auf eine Daten und liefert das gesuchte Resultat. so what?
Nicht ganz. Ändert man z. B. bei den Kunden 4 und 5 die Filiale von 3 auf 1, wird die Einheit 2 mit angezeigt, obwohl ja alle Kunden der gleichen Filiale zugeordnet sind. Und ich möchte ja nur Einheiten, bei denen mindestens 1 Kunde der Filiale 1 zugeordnet ist, und die Einheit Kunden mit unterschiedlichen Filialen beinhaltet.
Btw.: Feld kundennummer ist char(10), filiale char(3)
wer bis zum hals in der scheisse steckt, der sollte den kopf nicht hängen lassen
So besser?Code:test=*# select * from (select e.einheitnummer, array_agg(distinct k.filiale) as my_array from einheiten e left join kunden k on e.kundennummer=k.kundennummer group by 1) foo where 1 = any(my_array) and array_length(my_array,1) > 1; einheitnummer | my_array ---------------+---------- 1 | {1,2} 3 | {1,3} (2 rows)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
PS: Am Start ist PG 8.2.6 :-(Hm...So besser?
Gibts dafür auch ne Möglichkeit unter 8.4?
wer bis zum hals in der scheisse steckt, der sollte den kopf nicht hängen lassen
Ja.
Quelle: Doku, PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: User-Defined AggregatesCode:test=*# CREATE AGGREGATE array_accum (anyelement) test-# ( test(# sfunc = array_append, test(# stype = anyarray, test(# initcond = '{}' test(# ); CREATE AGGREGATE test=*# select * from (select e.einheitnummer, array_accum(distinct k.filiale) as my_array from einheiten e left join kunden k on e.kundennummer=k.kundennummer group by 1) foo where 1 = any(my_array) and array_length(my_array,1) > 1; einheitnummer | my_array ---------------+---------- 1 | {1,2} 3 | {1,3} (2 rows)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Also ich schäm mich ja schon langsam.
Ich bekomme die Fehlermeldung, dass auch array_length nicht existiert.
In der Doku finde ich die Funktion auch erst ab 8.4....
wer bis zum hals in der scheisse steckt, der sollte den kopf nicht hängen lassen
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen