Tabelle in Bericht gestalten

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Yaddayadda
**
Beiträge: 34
Registriert: Mi, 20.06.2012 14:13

Tabelle in Bericht gestalten

Beitrag von Yaddayadda »

Hallo,

ich habe ein Problem mit dem Report Builder. Und zwar habe ich eine kleine Adressverwaltung, in der u.a. mittels einer Abfrage die Anzahl der Personen je Ort und Gruppe ermittelt wird.

Im Bericht sieht das momentan so aus:

Code: Alles auswählen

Ort X
- Gruppe A: Anzahl
- Gruppe B: Anzahl
- Gruppe C: Anzahl

Ort Y
- Gruppe A: Anzahl
- Gruppe B: Anzahl
etc.

Ort Z
- Gruppe A: Anzahl
- Gruppe B: Anzahl
etc.
Ich hätte das ganze aber gerne so:

Code: Alles auswählen

Gruppe/Ort   A   B   C   D   E  Summe
X     	    2	4   6   5   2  19
Y    	     5	5   7   5   1  23
Z		      3	3   3   2   1  12
Summe	     10 12   16  12  4  54
Gibt es einen Weg, die Tabelle so gruppiert auszugeben oder geht das in OOO nicht?

LG, yaddayadda
---
Achso, LO 3.5.6, Win7
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Tabelle in Bericht gestalten

Beitrag von juetho »

Das Problem liegt weniger an OO, sondern an SQL. Das liefert eine Ergebnismenge in Form einer Tabelle. Du willst so etwas erreichen:

Code: Alles auswählen

SELECT Ortsname, AnzahlA, AnzahlB, AnzahlC, AnzahlD, AnzahlE, Summe FROM ...
Damit benötigst du für jede Zeile (d.h. für jeden Ort) fünf einzelne Summierungen und die Gesamtzahl. Das geht nur über eine Hilfstabelle oder diverse verschachtelte Abfragen, etwa so:

Code: Alles auswählen

SELECT t.Ort AS Ort, 
  ( SELECT Count(*) FROM Tabelle t
                    JOIN ( SELECT DISTINCT Ort FROM Tabelle ) h ON t.Ort = h.Ort 
                    WHERE ( Gruppenbedingung zu A ) ) AS A   /* usw. */
Wenn dein Datenbanksystem die Hilfstabelle mit WITH deklarieren kann, wird es etwas einfacher. Unter Umständen wird es auch mit UNION übersichtlicher. Auch das Stichwort Pivot könnte beim Suchen helfen; aber damit habe ich mich in der Praxis noch nie befasst.

Ein paar Hinweise findest du in der Einführung in SQL unter Mehr zu JOIN (über WITH), Berechnete Spalten, Unterabfragen und Nützliche Erweiterungen (über UNION).

Unter Umständen ist eine Lösung mit Hilfstabelle und Makro einfacher. Aber dafür brauchen wir mehr Informationen - neben deiner Tabellenstruktur vor allem das verwendete Datenbanksystem mit Version. Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
RobertG
********
Beiträge: 2068
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Tabelle in Bericht gestalten

Beitrag von RobertG »

Das Problem liegt darin, dass Du wirklich nur Daten in einer Zeile darstellen kannst, die auch im gleichen Datensatz vorliegen. Ursprünglich ist zwar in der Spezifikation des Report-Builders vorgesehen gewesen, dass auch in Spalten eingelesen werden kann, aber das ist wohl nie in den endgültigen Code eingeflossen.
Du musst also
Gruppe/Ort A B C D E
als Felder einer Abfrage erstellen, so wie juetho das bereits beschrieben hat.
Eine solche Abfrage wird als korrelierte Unterabfrage bezeichnet.
Deine Standardabfrage wäre

Code: Alles auswählen

SELECT COUNT(*) FROM "Adresse" WHERE "Gruppe" = 'A' AND "Ort" = 'X'
Diese Abfrage hast Du zu allen Gruppen. Setzt natürlich voraus, dass die Namen/Bezeichnungen der Gruppen vorher fest stehen.
Die Orte ermittelst Du eigentlich mit

Code: Alles auswählen

SELECT DISTINCT "Ort" FROM "Adresse"
DISTINCT, weil damit nicht laufend gleiche Ortsnamen ausgegeben werden, nur die unterschiedlichen Ortsnamen
Jetzt möchtest Du zu jedem Ort eine vorgegebene Gruppe zählen lassen:

Code: Alles auswählen

SELECT DISTINCT
"a"."Ort", 
(SELECT COUNT(*) FROM "Adresse" WHERE "Gruppe" = 'A' AND "Ort" = "a"."Ort") AS "Gruppe_A" 
FROM "Adresse" AS "a"
Damit nutzt Du den in der Hauptabfrage auftauchenden Wert von "Ort" für die Unterabfrage nach der Anzahl der Gruppe A. Den Zugang dazu verschafft Dir der Alsias "a" für die Tabelle "Adresse" in der Hauptabfrage.
Die Unterabfrage brauchst Du jetzt nur zu kopieren und einzufügen, dann jede Gruppe entsprechend durch Änderung von "Gruppe" = 'A' zu "Gruppe" = 'B' usw. abzufragen und schon hast Du neben dem jeweiligen Ort die Gruppen ausgezählt, die an dem Ort zu verzeichnen sind.

Gruß

Robert
Zuletzt geändert von RobertG am Fr, 12.10.2012 09:31, insgesamt 2-mal geändert.
Yaddayadda
**
Beiträge: 34
Registriert: Mi, 20.06.2012 14:13

Re: Tabelle in Bericht gestalten

Beitrag von Yaddayadda »

Hallo,

also das Datenbanksystem ist hsqldb extern (1.8 ).

Die Tabellenstruktur ist Haupttabelle "Stammdaten" mit ID, Name, Ort, Gruppen-ID und ein paar anderen, hier nicht relevanten Feldern. Gruppen-ID ist verknüpft mit Tabelle "Gruppen", dort sind die Gruppennamen abgespeichert (4 Stück). Eigentlich recht simpel gestrickt.
juetho hat geschrieben:Das Problem liegt weniger an OO, sondern an SQL. Das liefert eine Ergebnismenge in Form einer Tabelle. Du willst so etwas erreichen:

Code: Alles auswählen

SELECT Ortsname, AnzahlA, AnzahlB, AnzahlC, AnzahlD, AnzahlE, Summe FROM ...
Damit benötigst du für jede Zeile (d.h. für jeden Ort) fünf einzelne Summierungen und die Gesamtzahl. Das geht nur über eine Hilfstabelle oder diverse verschachtelte Abfragen, etwa so:

Code: Alles auswählen

SELECT t.Ort AS Ort, 
  ( SELECT Count(*) FROM Tabelle t
                    JOIN ( SELECT DISTINCT Ort FROM Tabelle ) h ON t.Ort = h.Ort 
                    WHERE ( Gruppenbedingung zu A ) ) AS A   /* usw. */
Wenn dein Datenbanksystem die Hilfstabelle mit WITH deklarieren kann, wird es etwas einfacher. Unter Umständen wird es auch mit UNION übersichtlicher. Auch das Stichwort Pivot könnte beim Suchen helfen; aber damit habe ich mich in der Praxis noch nie befasst.

Ein paar Hinweise findest du in der Einführung in SQL unter Mehr zu JOIN (über WITH), Berechnete Spalten, Unterabfragen und Nützliche Erweiterungen (über UNION).

Unter Umständen ist eine Lösung mit Hilfstabelle und Makro einfacher. Aber dafür brauchen wir mehr Informationen - neben deiner Tabellenstruktur vor allem das verwendete Datenbanksystem mit Version. Jürgen
Yaddayadda
**
Beiträge: 34
Registriert: Mi, 20.06.2012 14:13

Re: Tabelle in Bericht gestalten

Beitrag von Yaddayadda »

RobertG hat geschrieben:Setzt natürlich voraus, dass die Namen/Bezeichnungen der Gruppen vorher fest stehen.
Das tun sie.

Das mit den Unterabfragen raff ich zwar noch nicht, aber ich werde mir später noch mal in Ruhe den Code anschauen und ausprobieren.

LG, yaddayadda
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Tabelle in Bericht gestalten

Beitrag von DPunch »

Servus

Für Deine Zwecke brauchst Du keine Unterabfragen, das geht auch z.B. so
(Häkchen "SQL-Kommando direkt ausführen" nicht vergessen)

Code: Alles auswählen

SELECT 
	"Stammdaten"."Ort",
	SUM(CASE WHEN "Gruppen"."Name" = 'A' THEN 1 ELSE 0 END) AS A,
	SUM(CASE WHEN "Gruppen"."Name" = 'B' THEN 1 ELSE 0 END) AS B,
	SUM(CASE WHEN "Gruppen"."Name" = 'C' THEN 1 ELSE 0 END) AS C,
	SUM(CASE WHEN "Gruppen"."Name" = 'D' THEN 1 ELSE 0 END) AS D,
	SUM(CASE WHEN "Gruppen"."Name" = 'E' THEN 1 ELSE 0 END) AS E,
	SUM(1) AS Summe
FROM
	"Stammdaten", "Gruppen" 
WHERE
	"Stammdaten"."Gruppen_ID" = "Gruppen"."ID"
GROUP BY
	"Stammdaten"."Ort"
(Wenn Du Die Ergebniszeile dabei haben willst, kannst Du in obiger Abfrage "Stammdaten"."Ort" in 'Summe' ändern und dann ohne die GroupBy-Klausel per UNION einfach anhängen).

Problem ist bei derlei Dingen immer, dass die Abfrage nicht dynamisch ist, sprich: wenn eine Gruppe hinzukommt, muss sie eben auch in der Abfrage explizit berücksichtigt werden.
Andere DBMS bieten da elegantere Lösungen, mit der integrierten HSQLDB wirst Du um ein solches Konstrukt allerdings nicht herumkommen.
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Tabelle in Bericht gestalten

Beitrag von juetho »

Super, dieser Trick mit CASE innerhalb der Summierungen! (Irgendwo in der SQL-Einführung - siehe den obigen Link - wird er auch erwähnt; trotzdem ist er mir nicht eingefallen.) Gruß Jürgen

Bitte korrigiere noch deinen früheren Code, wo eine Klammer fehlt.
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Yaddayadda
**
Beiträge: 34
Registriert: Mi, 20.06.2012 14:13

Re: Tabelle in Bericht gestalten

Beitrag von Yaddayadda »

Wow, vielen Dank, funktioniert perfekt. :-)

Allerdings lässt sich die so generierte Abfrage nicht im Report Builder darstellen, die Orte werden zwar angezeigt, nicht aber die Summen für jede Gruppe und auch nicht die Gesamtsumme am Ende jeder Zeile. Habe es mit Datenquelle = die entsprechende Abfrage als auch mit Datenquelle = der direkte SQL-Befehl probiert und auch SQL-Befehl analysieren wahlweise auf ja und nein gestellt, kein Erfolg.

Dass die Abfrage nicht dynamisch ist, macht in meinem Fall nichts. Die Zahl und auch die Namen der Gruppen sind vorgegeben. Sollte sich da tatsächlich irgendwann mal etwas dran ändern, kann ich die Abfrage immer noch anpassen.

LG, yaddayadda
RobertG
********
Beiträge: 2068
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Tabelle in Bericht gestalten

Beitrag von RobertG »

Vielleicht versuchst Du einmal die Aliasbezeichnungen in doppelte Anführungszeichen zu setzen?
(AS "A" ...)
Kann sein, dass dann der Report-Builder mitspielt.
Ansonsten bleiben ja immer noch die korrelierenden Unterabfragen ...

Gruß

Robert
Yaddayadda
**
Beiträge: 34
Registriert: Mi, 20.06.2012 14:13

Re: Tabelle in Bericht gestalten

Beitrag von Yaddayadda »

RobertG hat geschrieben:Vielleicht versuchst Du einmal die Aliasbezeichnungen in doppelte Anführungszeichen zu setzen?
(AS "A" ...)
Kann sein, dass dann der Report-Builder mitspielt.
Ansonsten bleiben ja immer noch die korrelierenden Unterabfragen ...

Gruß

Robert
Die Lösung ist viel einfacher, ich muss die Abfrage nur als Ansicht erstellen und daraus den Bericht generieren lassen, dann geht es! Hurra! :-D
Antworten