Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Abfrage mit Gruppierung

  1. #1
    toni_83 ist offline Benutzer
    Registriert seit
    08.07.2008
    Beiträge
    42

    Standard Abfrage mit Gruppierung

    Hallo zusammen,

    ich hänge mal wieder an einer Abfrage.

    Nötige Tabellen sind folgende:

    Tabelle einheit
    Code:
    einheitnummer, kundennummer
    Tabelle kunden
    Code:
    kundennummer, filiale
    In einer Einheit können mehrere Kunden sein.

    Nun zu meinem Problem:
    Ich brauche alle Einheiten, die Kunden mit unterschiedlichen Filialen beinhalten:
    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)
    So weit so gut :-)

    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

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von toni_83 Beitrag anzeigen
    Hallo zusammen,

    ich hänge mal wieder an einer Abfrage.

    Nötige Tabellen sind folgende:

    Tabelle einheit
    Code:
    einheitnummer, kundennummer
    Tabelle kunden
    Code:
    kundennummer, filiale
    In einer Einheit können mehrere Kunden sein.

    Nun zu meinem Problem:
    Ich brauche alle Einheiten, die Kunden mit unterschiedlichen Filialen beinhalten:
    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)
    So weit so gut :-)

    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 :-(
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    toni_83 ist offline Benutzer
    Registriert seit
    08.07.2008
    Beiträge
    42

    Standard

    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 |            9
    Code:
    test=*# select * from kunden;
     kundennummer | filiale
    --------------+---------
                1 |       1
                2 |       1
                3 |       2
                4 |       3
                5 |       3
                6 |       1
                7 |       3
                8 |       4
                 9 |       5
    Code:
    test=*# select meine richtige abfrage;
      einheitnummer
    ---------------
                 1 |
                 3 |
    Ich möchte also alle Einheitennummern, die Kunden mit unterschiedlichen Filialen beinhalten, bei denen mindestens ein Kunde der Filiale 1 zugeordnet ist.
    wer bis zum hals in der scheisse steckt, der sollte den kopf nicht hängen lassen

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von toni_83 Beitrag anzeigen
    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 |            9
    Code:
    test=*# select * from kunden;
     kundennummer | filiale
    --------------+---------
                1 |       1
                2 |       1
                3 |       2
                4 |       3
                5 |       3
                6 |       1
                7 |       3
                8 |       4
                 9 |       5
    Code:
    test=*# select meine richtige abfrage;
      einheitnummer
    ---------------
                 1 |
                 3 |
    Ich möchte also alle Einheitennummern, die Kunden mit unterschiedlichen Filialen beinhalten, bei denen mindestens ein Kunde der Filiale 1 zugeordnet ist.
    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)
    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?

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    toni_83 ist offline Benutzer
    Registriert seit
    08.07.2008
    Beiträge
    42

    Standard

    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

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von toni_83 Beitrag anzeigen
    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)
    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)
    So besser?


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    toni_83 ist offline Benutzer
    Registriert seit
    08.07.2008
    Beiträge
    42

    Standard

    PS: Am Start ist PG 8.2.6 :-(
    So besser?
    Hm...

    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

  8. #8
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von toni_83 Beitrag anzeigen
    Hm...

    Gibts dafür auch ne Möglichkeit unter 8.4?
    Ja.

    Code:
    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)
    Quelle: Doku, PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: User-Defined Aggregates

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    toni_83 ist offline Benutzer
    Registriert seit
    08.07.2008
    Beiträge
    42

    Standard

    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

  10. #10
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von toni_83 Beitrag anzeigen
    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....
    Okay, das hatte ich nicht bedacht, sorry. Nun, was spricht gegen 8.4?


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum