Tabelle in Bericht gestalten

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Tabelle in Bericht gestalten

Re: Tabelle in Bericht gestalten

von Yaddayadda » So, 07.10.2012 09:08

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

Re: Tabelle in Bericht gestalten

von RobertG » Sa, 06.10.2012 20:20

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

Re: Tabelle in Bericht gestalten

von Yaddayadda » Sa, 06.10.2012 19:23

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

Re: Tabelle in Bericht gestalten

von juetho » Sa, 06.10.2012 19:22

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.

Re: Tabelle in Bericht gestalten

von DPunch » Sa, 06.10.2012 18:58

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.

Re: Tabelle in Bericht gestalten

von Yaddayadda » Sa, 06.10.2012 17:40

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

Re: Tabelle in Bericht gestalten

von Yaddayadda » Sa, 06.10.2012 17:36

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

Re: Tabelle in Bericht gestalten

von RobertG » Sa, 06.10.2012 12:30

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

Re: Tabelle in Bericht gestalten

von juetho » Sa, 06.10.2012 12:06

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

Tabelle in Bericht gestalten

von Yaddayadda » Sa, 06.10.2012 11:32

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

Nach oben