komplexe Abfrage mit mehrfachem Count()

Moin,
ich möchte eine Statistik über die Daten in eine DB erstellen. Folgende Struktur:

t_wavesegment:
s_id, file_id(fk), [data], classifier_id(fk)

t_classifier:
classifier_id, desr

t_files:
file_id, filename, person_id

Im Endeffekt gibt gibt es Datensätze, die jeder für sich eine Klassifizierung haben (feste Skala durch t_classifier) und verschiedenen oder gleichen Dateien zugeordnet sind.

Ich möchte eine Statistik über die Anzahl der einzelnen Klassifikationen pro Datei und darüber auch pro Person. Das kann ich mir dann aber über den Personenschlüssel aus t_files holen.

Kann man das über ein cleveres SQL-Statement lösen oder soll ich gleich eine stored procedure bauen? Ich hab schon gesucht, die ich eine View so anlege, das jede Spalte durch ein SQL-Statement befüllt wird, aber entweder habe ich ein Brett vor dem Kopf oder ich muss erst noch ein paar Tassen Kaffee trinken.

Das Ergebnis soll dann so aussehen:

name  |klasse_A|klasse_b|....|klasse_z
-------------------------------------
file_a| 1      | 30     |....| 15
file_b| 4      | ....

Freu mich jedenfalls über Ideen und Vorschläge, muss jetzt aber erstmal in ein ödes Meeting :roll:

Domski

SELECT MIN(f.filename),MIN(c.desr),COUNT(*) as anzahl
FROM t_wavesegment w 
	INNER JOIN t_classifier c ON c.classifier_id = w.classifier_id
	INNER JOIN t_files f ON f.file_id = w.file_id
GROUP BY file_id,classifier_id ORDER BY MIN(f.filename), MIN(c.desr)

müsste dir eigentlich die informationen für die statistik liefern, allerdings weis ich nicht ob das dein problem war. oder eher die darstellung mit inhalten als feldnamen ??

mfg
henrik

[quote=“henrik”]

SELECT MIN&#40]


müsste dir eigentlich die informationen für die statistik liefern, [/quote]

Danke für die prompte Antwort, das sieht schonmal gut aus. Auf die Idee bin ich heute früh gar nicht gekommen, das so zusmamenzufassen.

[quote="henrik"]
allerdings weis ich nicht ob das dein problem war. oder eher die darstellung mit inhalten als feldnamen ??

mfg 
   henrik[/quote]

Ich hatte mich eher darauf konzenztiert, für jeden enthaltenen c.descr eine Spalte und eine Zeile pro Datei zu erzeugen, weils für die weitere Verarbeitung einfach das Optimum wäre.

[/quote]

das ganze nennt sich Pivotabfrage und kann, wenn du dynamisch, d.h. ohne Code-Änderung, neue “Klassen” erscheinen lassen willst, nur mit PL/pgSQL machen (oder bestimmt einer der anderen Sprachen für stored procedures).

Danke für das Stichwort, genau das hat mir gefehlt :slight_smile:

Ich habe das jetzt mit einer SQL-Abfrage ähnlich der von Henrik vorgeschlagenen realisiert, deren Ergebnis ich auf die Funktion crosstab(text,text) aus der Lib tablefunc geschickt habe. Das Teil ist im Paket postgresql-contrib enthalten enthält und in C geschriebene Funktionen. Die Crosstab erzeugt die entsprechende Pivottabelle.

Hier nochmal meine komplette Abfrage:

SELECT * from crosstab&#40]