Abfrage ähnlich einer Kreuztabelle - FAQ-Base

From The Document Foundation Wiki
< Faq‎ | Base‎ | 142
Jump to: navigation, search

Wie kann eine Abfrage Informationen ähnlich einer Kreuztabelle darstellen?

Eine Abfrage für Buchungen soll folgendes Auswertungsbild bieten:

Kategorie Saldo Vormonat aktueller Monat Saldo
Essen 1365 € 250 € 1615 €
Mobilität 275 € 73 € 348 €
Kleidung 362 € 125 € 487 €
Summe 2002 € 448 € 2450 €

Die Abfrage hierfür fusst auf zwei Tabellen:

ID Kategorie
1 Essen
2 Mobilität
3 Kleidung
ID Datum Betrag KategorieID
1 2017-01-07 34 € 1
2 2017-01-15 23 € 1
3 2017-01-18 114 € 3

Die Inhalte der 2. Tabelle stellen natürlich nur einen Auszug dar. Die Tabelle "Kategorie" ist mit der Tabelle "Einkauf" über einen Fremdschlüssel verbunden.

Der Inhalt der einzelnen Felder kann durch korrelierende Unterabfragen ermittelt werden:

SELECT "a"."Kategorie", (SELECT SUM("Betrag") FROM "Einkauf" WHERE "KategorieID" = "a"."ID") AS "Saldo" FROM "Kategorie" AS "a"

Hier wird das Saldo, also die letzte Spalte der Tabelle, neben der Kategorie dargestellt. In der Unterabfrage wird über "a"."ID" die Kategorie berücksichtigt, auf die sich der aktuelle Datensatz bezieht. Die Unterabfrage gibt jeweils nur einen Wert wieder.

SELECT "a"."Kategorie",
(SELECT SUM("Betrag") FROM "Einkauf" WHERE "KategorieID" = "a"."ID" AND (EXTRACT(MONTH FROM "Datum") < EXTRACT(MONTH FROM CURRENT_DATE) OR EXTRACT(YEAR FROM "Datum") < EXTRACT(YEAR FROM CURRENT_DATE))) AS "Saldo Vormonat",
(SELECT SUM("Betrag") FROM "Einkauf" WHERE "KategorieID" = "a"."ID" AND (EXTRACT(MONTH FROM "Datum") = EXTRACT(MONTH FROM CURRENT_DATE) AND EXTRACT(YEAR FROM "Datum") = EXTRACT(YEAR FROM CURRENT_DATE))) AS "aktueller Monat",
(SELECT SUM("Betrag") FROM "Einkauf" WHERE "KategorieID" = "a"."ID") AS "Saldo" FROM "Kategorie" AS "a"

Hier ist der Betrag in die Summe aus den bisherigen Monaten und den Betrag des aktuellen Monats aufgesplittet.

SELECT DISTINCT 'Summe',
(SELECT SUM("Betrag") FROM "Einkauf" WHERE EXTRACT(MONTH FROM "Datum") < EXTRACT(MONTH FROM CURRENT_DATE) OR EXTRACT(YEAR FROM "Datum") < EXTRACT(YEAR FROM CURRENT_DATE)) AS "Saldo Vormonat",
(SELECT SUM("Betrag") FROM "Einkauf" WHERE EXTRACT(MONTH FROM "Datum") = EXTRACT(MONTH FROM CURRENT_DATE) AND EXTRACT(YEAR FROM "Datum") = EXTRACT(YEAR FROM CURRENT_DATE)) AS "aktueller Monat",
(SELECT SUM("Betrag") FROM "Einkauf") AS "Saldo" FROM "Kategorie"

Diese 2. Abfrage ermittelt nur die Summen ohne Berücksichtigung der Kategorien. Die beiden Abfragen werden mit UNION verbunden. Allerdings muss vorher in den direkten SQL-Modus umgestellt werden. Abfragen, die mit UNION verbunden werden funktionieren nicht in der GUI.

SELECT "a"."Kategorie",
(SELECT SUM("Betrag") FROM "Einkauf" WHERE "KategorieID" = "a"."ID" AND (EXTRACT(MONTH FROM "Datum") < EXTRACT(MONTH FROM CURRENT_DATE) OR EXTRACT(YEAR FROM "Datum") < EXTRACT(YEAR FROM CURRENT_DATE))) AS "Saldo Vormonat",
(SELECT SUM("Betrag") FROM "Einkauf" WHERE "KategorieID" = "a"."ID" AND (EXTRACT(MONTH FROM "Datum") = EXTRACT(MONTH FROM CURRENT_DATE) AND EXTRACT(YEAR FROM "Datum") = EXTRACT(YEAR FROM CURRENT_DATE))) AS "aktueller Monat",
(SELECT SUM("Betrag") FROM "Einkauf" WHERE "KategorieID" = "a"."ID") AS "Saldo" FROM "Kategorie" AS "a"
UNION
SELECT DISTINCT 'Summe',
(SELECT SUM("Betrag") FROM "Einkauf" WHERE EXTRACT(MONTH FROM "Datum") < EXTRACT(MONTH FROM CURRENT_DATE) OR EXTRACT(YEAR FROM "Datum") < EXTRACT(YEAR FROM CURRENT_DATE)) AS "Saldo Vormonat",
(SELECT SUM("Betrag") FROM "Einkauf" WHERE EXTRACT(MONTH FROM "Datum") = EXTRACT(MONTH FROM CURRENT_DATE) AND EXTRACT(YEAR FROM "Datum") = EXTRACT(YEAR FROM CURRENT_DATE)) AS "aktueller Monat",
(SELECT SUM("Betrag") FROM "Einkauf") AS "Saldo" FROM "Kategorie"