Count von Spaltenwerten

Maris

Aktiver Benutzer
Beiträge
32
Hallo zusammen,

ich habe hier ein Problem und keine Ahnung wie ich das lösen kann.

Ich habe eine Tabelle wie auf dem ersten Sccrenshot.

Tabelle.PNG

Als Ergebnis möchte ich die Anzahl der Zahlen in einer neuen Tabelle dargestellt bekommen. Beispiel bei Merkmal 1 kommt die Zahl drei ---> fünf mal vor.

Tabelle_Ergebnis.PNG

Über Hilfe wie das Problem zu lösen ist würde ich mich sehr freuen.
Gruß,
Maris
 
Werbung:
Du hast:

Code:
test=*# select * from maris;
 id | m1 | m2 | m3
----+----+----+----
  1 |  1 |  5 |  5
  2 |  3 |  6 |  3
  3 |  1 |  9 |  6
  4 |  3 |  6 |  6
  5 |  5 |  6 |  3
  6 |  3 |  5 |  1
  7 |  4 |  9 |  3
  8 |  3 |  5 |  5
  9 |  3 |  6 |  1
(9 Zeilen)

und suchst

Code:
test=*# select i, sum(case when m1 = i then 1 else 0 end) as m1, sum(case when m2 = i then 1 else 0 end) as m2, sum(case when m3 = i then 1 else 0 end) as m3 from generate_series(1, 10) i(i), maris group by i order by i;
 i  | m1 | m2 | m3
----+----+----+----
  1 |  2 |  0 |  2
  2 |  0 |  0 |  0
  3 |  5 |  0 |  3
  4 |  1 |  0 |  0
  5 |  1 |  3 |  2
  6 |  0 |  4 |  2
  7 |  0 |  0 |  0
  8 |  0 |  0 |  0
  9 |  0 |  2 |  0
 10 |  0 |  0 |  0
(10 Zeilen)

oder?

Aber eigentlich suchst Du die Erkenntniss, daß Datenbanken keine Tabellenkalkulationen sind.

Außerdem ist Deine Zielvorgabe falsch. Deinen Fehler selbst zu finden überlasse ich Dir zur Übung ;-)
 
Hallo akretschmer,

danke für deine Hilfe. Ich habe jetzt mal versuch dein Statement umzusetzen. Leider bekomme ich ein Syntax-Fehlermeldung 1064:

SELECT i,
SUM(case when m1= i then 1 else 0 end) as m1, SUM(case when m2= i then 1 else 0 end) as m2
FROM generate_series(1, 10) i(i), maris
GROUP BY i
ORDER BY i;

An der Zielvorgabe habe ich mich auch versucht aber nichts herausgefunden. Wie meinst du das?

Gruß,
Maris
 
Du musst das an MySQL-Syntax anpassen da akretschmer nur PG nutzt. In MySQL gibt es kein generate_series() wobei du in der Praxis vermutlich keine Merkmale mit Ziffern in einer Reihe hast also deine Liste an Merkmalen sowieso anders erstellen musst.

In MySQL müsste das hier gehen:
Code:
SELECT   t2.m,
     sum( CASE WHEN m1 = t2.m THEN 1 ELSE 0 END ) AS m1,
     sum( CASE WHEN m2 = t2.m THEN 1 ELSE 0 END ) AS m2,
     sum( CASE WHEN m3 = t2.m THEN 1 ELSE 0 END ) AS m3
FROM   tabelle,
     (
SELECT   DISTINCT t1.m
FROM   (
SELECT   m1 AS m
FROM   tabelle
UNION ALL
SELECT   m2 AS m
FROM   tabelle
UNION ALL
SELECT   m3 AS m
FROM   tabelle
     ) t1
     ) t2
GROUP BY t2.m
ORDER BY t2.m
Sieht wirr aus, ist es auch. Vermutlich ist die Ausgangstabelle nicht normalisiert.
 
Hallo Ukulele,

ich denke dein Statement hat funktioniert. Im Screenshot das Ergebnis... In Zeile 1 ist nichts hinterlegt, ich denke diese Merkmale sind dann einfach nicht belegt, oder?

Wie würde der Code aussehen wenn ich noch ein "m" hinzufüge also m4 beispielsweise.

Grüße,
Maris
 

Anhänge

  • Ergebnis.PNG
    Ergebnis.PNG
    11,6 KB · Aufrufe: 0
In einer normalisierten DB wäre das kein Problem und die Abfrage müsste nicht geändert werden. In deinem Schema ein Merkmal = eine Spalte musst du für jedes Merkmal deine "Merkmaleliste" erweitern (in meinem Beispiel die Tabelle t1) und das Select um eine weitere CASE-Anweisung ergänzen.
 
So vielleicht:

SELECT t2.m,
sum( CASE WHEN m1 = t2.m THEN 1 ELSE 0 END ) AS m1,
sum( CASE WHEN m2 = t2.m THEN 1 ELSE 0 END ) AS m2,
sum( CASE WHEN m3 = t2.m THEN 1 ELSE 0 END ) AS m3
sum( CASE WHEN m4 = t2.m THEN 1 ELSE 0 END ) AS m4
FROM tabelle,
(
SELECT DISTINCT t1.m
FROM (
SELECT m1 AS m
FROM tabelle
UNION ALL
SELECT m2 AS m
FROM tabelle
UNION ALL
SELECT m3 AS m
FROM tabelle
UNION ALL
SELECT m4 AS m
FROM tabelle
) t1
) t2
GROUP BY t2.m
ORDER BY t2.m;

Was ist mit den Werten die nicht belegt sind? Die konnten nicht zugeordnet werden, oder?

Gruß,
Maris
 
Werbung:
Mit dem Select hinter t1 erstellst du eine Werte-Liste, in diesem Fall aus allen Werten die vorhanden sind. Das kannst du auch manuell machen in dem du da UNION ALL SELECT 2 hinter setzt, elegant ist das nicht.
 
Zurück
Oben