Join Kombinationen

pakoe

Neuer Benutzer
Beiträge
4
Hallo,
ich habe folgendes Problem, das ich gerne mit einem SQL-Statement oder alternativ lösen möchte:

1. Ausgangstabelle (2 Spalten)
------------------------------------------------------------------
create table basis
(article Integer,
supplier VarChar(10) );

Insert into basis Values (4711, 'A');
Insert into basis Values (4712, 'B');
Insert into basis Values (4712, 'C');
Insert into basis Values (4712, 'D');
Insert into basis Values (4713, 'C');
Insert into basis Values (4713, 'E');
------------------------------------------------------------------

2. Zieltabelle

Alle Kombinationen, wobei jeder article (4711,4712,4713) immer vorhanden sein muss. Das ergibt in diesem Fall 6 Kombinationspärchen und somit 18 Datensätze.

combination_nr;article;supllier
1;4711;'A'
1;4712;'B'
1;4713;'C'
2;4711;'A'
2;4712;'B'
2;4713;'E'
2;4711;'A'
3;4712;'C'
3;4713;'C'
4;4711;'A'
4;4712;'D'
4;4713;'E'
5;4711;'A'
5;4712;'D'
5;4713;'C'
6;4711;'A'
6;4712;'D'
6;4713;'E'

Klingt einfach, aber für mich sehr schwer.

VG
 
Werbung:
irgendwas stimmt mit Deinen Daten nicht, Du hast 3 verschiedene article und 5 verschiedene supplier:

Code:
test=*# select * from basis ;
 article | supplier
---------+----------
    4711 | A
    4712 | B
    4712 | C
    4712 | D
    4713 | C
    4713 | E
(6 rows)

test=*# with article as (select distinct article from basis), supplier as (select distinct supplier from basis) select * from article cross join supplier;
 article | supplier
---------+----------
    4711 | B
    4711 | C
    4711 | D
    4711 | E
    4711 | A
    4713 | B
    4713 | C
    4713 | D
    4713 | E
    4713 | A
    4712 | B
    4712 | C
    4712 | D
    4712 | E
    4712 | A
(15 rows)
 
ja, das stimmt.

Artikel 4711 kann von supplier A geliefert werden
Artikel 4712 kann von den Suppliern (B,C,D) geliefert werden
Artikel 4713 kann von den Suppliern (C,E) geliefert werden

Das Ziel ist es, alle Lieferantenkombinationen zu ermitteln, wobei immer alle 3 Artikel geliefert werden müssen.

VG
pakoe
 
Code:
test=*# select article, array_agg(supplier) from basis group by article;
 article | array_agg
---------+-----------
    4711 | {A}
    4713 | {C,E}
    4712 | {B,C,D}
(3 rows)

Hilft Dir das?

Oder her das:

Code:
test=*# select article, count(distinct supplier) from basis group by article having count(distinct(supplier)) = (select count(distinct article) from basis);
 article | count
---------+-------
    4712 |     3
(1 row)


Das hat aber in beiden Fällen nix mit den gewünschten 18 Datensätzen des Eingangspostings zu tun ...
 
Code:
test=*# select article, array_agg(supplier) from basis group by article;
 article | array_agg
---------+-----------
    4711 | {A}
    4713 | {C,E}
    4712 | {B,C,D}
(3 rows)

Hilft Dir das?

Oder her das:

Code:
test=*# select article, count(distinct supplier) from basis group by article having count(distinct(supplier)) = (select count(distinct article) from basis);
 article | count
---------+-------
    4712 |     3
(1 row)


Das hat aber in beiden Fällen nix mit den gewünschten 18 Datensätzen des Eingangspostings zu tun ...
 
Der array sieht gut aus, aber die einzelnen Datensätze habe ich noch nicht.
Hast du eine Idee, wie man die erzeugen kann?
 
Werbung:
nun zufrieden?

Code:
test=*# with my_array as (select article, array_agg(supplier) from basis group by article having count(supplier) = (select count(distinct article) from basis)) select basis.* from basis join my_array on basis.article = my_array.article and supplier = any(array_agg);
 article | supplier
---------+----------
    4712 | B
    4712 | C
    4712 | D
(3 rows)
 
Zurück
Oben