1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Probleme mit count bei group by nach zwei Attributen

Dieses Thema im Forum "PostgreSQL" wurde erstellt von doerflia, 10 Juli 2019.

  1. doerflia

    doerflia Benutzer

    Hi,

    eigentlich total einfach, aber irgendwie komme ich nicht drauf.

    Mein Datensatz sieht wie folgt aus (Tabellenspalten geändert, da Daten vertraulich):
    id1|id2|id3
    -------------
    1|1|0
    1|1|1
    1|1|2
    1|2|0
    1|2|1
    1|3|0
    1|3|1
    1|3|2
    1|3|3
    2|1|0
    2|1|1
    2|1|2
    ...

    Ich versuche nach id1 und id2 einen Group-By Befehl zu setzen und die Anzahl der gemeinsamen Datensätze zu zählen und dafür eine neue Tabelle zu erzeugen.

    Der Code:
    CREATE TABLE Count AS
    SELECT id1,
    id2,
    count(id2)
    FROM table1
    GROUP BY id1, id2

    Ich erhalte die Tabelle Count mit:
    id1|id2|count
    -------------
    1|1|7
    1|2|5
    1|3|27
    2|1|7
    ....

    Ok, es wird ja auch nur id2 gezählt...
    Ein Count-Befehl count(id1, id2) gibt es nicht...

    Aber was ich eigentlich möchte, ist eine Tabelle in Form:
    id1|id2|count
    ----------------
    1|1|3
    1|2|2
    1|3|4
    2|1|3

    Wie bekomme ich hin, dass die eindeutigen Kombinationen des Wertepaars id1, id2 und
    nicht id2 gezählt wird?
    Hat da jemand eine Idee?

    Eigentlich kann das ja nicht so schwer sein, aber irgendwie habe ich da gerade einen Knoten im Kopf.


    Vielen Dank & Liebe Grüße
    Matthias
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from doerflia ;
     id1 | id2 | id3
    -----+-----+-----
       1 |   1 |   0
       1 |   1 |   1
       1 |   1 |   2
       1 |   2 |   0
       1 |   2 |   1
       1 |   3 |   0
       1 |   3 |   1
       1 |   3 |   2
       1 |   3 |   3
       2 |   1 |   0
       2 |   1 |   1
       2 |   1 |   2
    (12 rows)
    
    test=*# select id1, id2, count(1) from doerflia group by id1, id2 order by id1, id2;
     id1 | id2 | count
    -----+-----+-------
       1 |   1 |     3
       1 |   2 |     2
       1 |   3 |     4
       2 |   1 |     3
    (4 rows)
    
    test=*#
    
     
  3. doerflia

    doerflia Benutzer

    Danke für die Schnelle Antwort.
    Also leider macht dein Code auch nicht das was ich will...
    Hast du den Code bei dir getestet? Oder einfach nur so gepostet?

    Was soll denn count(1) machen???

    Code:
    Also ich erhalte so auch:
    test = *#select id1, id2, count(1) from table1 group by id1, id2 order by id1, id2;
     id1 | id2 | count
    -----+-----+-------
       1 |   1 |     7
       1 |   2 |     5
       1 |   3 |     27
       2 |   1 |     7
    (4 rows)
    
     
  4. akretschmer

    akretschmer Datenbank-Guru

    ja, ich habe ihn getestet ;-)

    Du kannst auch count(*) nehmen - es zählt die Vorkommen, gruppiert nach (id1,id2).

    Code:
    test=*# select id1, id2, count(*) from doerflia group by (id1, id2) order by id1, id2;
     id1 | id2 | count
    -----+-----+-------
       1 |   1 |     3
       1 |   2 |     2
       1 |   3 |     4
       2 |   1 |     3
    (4 rows)
    
    test=*#
    
     
  5. doerflia

    doerflia Benutzer

    Gut, dann muss ich das Problem wohl falsch geschildert haben...
    Weil ich bekomme ein anderes Ergebnis, wie das was ich erwartet habe...

    Mein Code:
    Code:
    SELECT lanegroup_id,
           roadid,
           count(*)
    FROM map.lane
    GROUP BY roadid, lanegroup_id
    ORDER BY roadid, lanegroup_id
    
    Die Ausgabe:
    upload_2019-7-10_11-19-21.png

    Zähle ich nach, so muss Zeile 7 z. B. 2 Werte erhalten.

    Über ein anderes Programm, mit dem ich arbeite, kann ich einen Filter setzen, um mir die Datensätze anzuzeigen:
    upload_2019-7-10_11-21-37.png
    Diese Ausgabe sieht dann wie folgt aus (also auch 2 Werte):
    upload_2019-7-10_11-22-24.png
    Der SQL-Befehl zählt aber 7 statt 2 Werte.

    Eine Idee, was ich falsch mache?!
    Also ehrlicherweise verstehe ich den Fehler nicht :D
    Ich war mir ja auch sicher, dass das so funktionieren wird...
     

    Anhänge:

  6. akretschmer

    akretschmer Datenbank-Guru

    vermutlich PEBKAC. Vielleicht prüfst Du unterschiedliche Tabellen, Datenbanken, Schemas. Oder hast noch weitere Conditions im Where. Meine Glaskugel ist diese Woche im Urlaub.
     
    Faabris gefällt das.
  7. doerflia

    doerflia Benutzer

    Fehler gefunden, wenn auch nicht verstanden :D
    Aber Code läuft jetzt.
    Dir dennoch danke!

    Hab hinter count distinct eingefügt... count(distinct roadid)
    Dann hatte er überall eine 1 gezählt.
    Die Sortierung und GroupBy so geändert wie ich das möchte (lanegoup_id, roadid)
    Dann habe ich distinct wieder gelöscht...
    Ging.

    Wieso die Reihenfolge einen Unterschied macht, ist mir nicht klar.
    Also wenn ich erst nach RoadId filtere und dann nach LanegroupID, dann macht das für mich von den Daten her keinen Unterschied, nur von der Darstellung her.
    Aber: beim Zählen scheinbar schon. Irgendwie zählt dann mein PC "Mist".
    Weder wurde die Anzahl aller gleichen "road"-IDs, noch aller gleichen "lanegroup"-IDs, noch aller gleichen Kombinationen gezählt...
     
    Faabris gefällt das.
  8. akretschmer

    akretschmer Datenbank-Guru

    Nicht verständlich, was Du wann wie gemacht hast und was bei rauskommt. Aber das Problem scheint ja gelöst zu sein ...
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden