Frequently asked questions - Base
TDF LibreOffice Document Liberation Project Community Blogs Weblate Nextcloud Redmine Ask LibreOffice Spende
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',
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 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"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"