Seite 1 von 2

Abfrage mit mehreren Spalten für ein Feld?

Verfasst: Do 11. Dez 2014, 22:17
von Freischreiber
Hallo,

ich habe ein spezielles Problem.

Meine Buchungstabelle hat Buchungen im Format
ID-Datum-KontoID-Betrag-Be merkung

KontoIDs sind unterschiedliche Einnahmearten, z. B. gibt es "Ein19" für Einnahmen inkl. 19% USt, "Ein7" für Einnahmen inkl. 7%, usw., bei Aus19 und Aus7 das gleiche.

Jetzt hätte ich gerne eine Abfrage, die eine Tabelle liefert mit:
1. Spalte Datum
2. Spalte Ein19
3. Spalte Ein7
4. Spalte Aus19
5. Spalte Aus7

Es sollen alle Buchungssätze angezeigt werden, d. h. jede Zeile soll, bis auf Datum in Spalte 1 und die Spalte für das einschlägige Konto, leere Zellen anzeigen.

Etwa so:

Code: Alles auswählen

Datum         Ein19       Ein7        Aus19        Aus7
11.12.14     119,00
12.12.14                  107,00
12.12.14                                           28,00
Geht so etwas, und wenn ja wie?

Gruß
Freischreiber

Re: Abfrage mit mehreren Spalten für ein Feld?

Verfasst: Fr 12. Dez 2014, 08:51
von gogo
Das waere eine Pivot- oder Kreuztabelle, das kann man aber auf den meisten Datenbanksystemen nicht (oder nur SEHR komplex) realisieren, ausser man verwendet eine vorgefertigte Tabelle als "Zwischenspeicher" und befuellt diese dann mit den aktuellen Daten.
Mit Bordmitteln alleine nicht zu bewaeltigen - da brauchst Du Makros.

Alternativ: Select Datum, KontoID, sum(Betrag) as Summe from Buchungstabelle group by Datum, KontoID

Re: Abfrage mit mehreren Spalten für ein Feld?

Verfasst: Fr 12. Dez 2014, 09:10
von Freischreiber
Hallo gogo,

ganz genau, diese sehr übersichtlichen Pivottabellen habe ich in Excel kennengelernt, wo meine Daten herkommen.

Deine Abfrage sieht ziemlich gut aus, vielen Dank, nur die Verteilung auf mehrere Spalten wäre halt noch schön.

Jetzt habe ich ja bei F3KTotal in einem Video gesehen, daß man Base-Abfragen sehr gut zu Calc schicken kann:
https://www.youtube.com/watch?v=eqZHdqqtEKE

Kann man dort nicht eine solche gruppierte Abfrage "auseinanderziehen" auf mehrere Spalten?

Gruß
Freischreiber

Re: Abfrage mit mehreren Spalten für ein Feld?

Verfasst: Fr 12. Dez 2014, 09:39
von gogo
in Clac:

Daten/Datenpilot

"Datum" auf "Row Fields" ziehen
"Konto" auf "Column Fields" ziehen
"Betrag" auf "Data Fields" ziehen
(hab hier nur eine englische Version...)

Re: Abfrage mit mehreren Spalten für ein Feld?

Verfasst: Sa 13. Dez 2014, 17:25
von RobertG
Hallo Freischreiber,

versuche es mit einer korrelierenden Unterabfrage:

Code: Alles auswählen

SELECT "a"."Datum", (SELECT "Betrag" FROM "Buchungstabelle" WHERE "KontoID" = 'Ein19' AND "ID" = "a"."ID") AS "Ein19", (SELECT "Betrag" FROM "Buchungstabelle" WHERE "KontoID" = 'Ein7' AND "ID" = "a"."ID") AS "Ein7" FROM "Buchungstabelle"
Gruß

Robert

Re: Abfrage mit mehreren Spalten für ein Feld?

Verfasst: Sa 13. Dez 2014, 18:33
von F3K Total
... oder mit

Code: Alles auswählen

LEFT JOIN
ala

Code: Alles auswählen

SELECT 
    "BUCHUNGEN"."Datum", 
    "a"."Betrag" "Ein19", 
    "b"."Betrag" "Ein7" , 
    "c"."Betrag" "Aus19" , 
    "d"."Betrag" "Aus7" 
FROM  
    "BUCHUNGEN" 
    LEFT JOIN "BUCHUNGEN" AS "a" 
    ON ("BUCHUNGEN"."ID" = "a"."ID" AND "a"."KontoID" = 0)
    LEFT JOIN "BUCHUNGEN" AS "b" 
    ON ("BUCHUNGEN"."ID" = "b"."ID" AND "b"."KontoID" = 1)
    LEFT JOIN "BUCHUNGEN" AS "c" 
    ON ("BUCHUNGEN"."ID" = "c"."ID" AND "c"."KontoID" = 2)
    LEFT JOIN "BUCHUNGEN" AS "d" 
    ON ("BUCHUNGEN"."ID" = "d"."ID" AND "d"."KontoID" = 3)
ORDER BY 
    "BUCHUNGEN"."Datum"
Gruß R

Re: Abfrage mit mehreren Spalten für ein Feld?

Verfasst: So 14. Dez 2014, 11:01
von Freischreiber
Hallo!

Vielen Dank für eure Tips! Das mit der Pivottabelle in Calc hat auf Anhieb geklappt, die aktualisiert sich sogar beim Neuladen der Tabelle.

Die beiden anderen Lösungen probier ich aus, sobald ich wieder sitzen kann - ich hab gestern meine ganzen alten Daten aus den Tabellen in die Datenbank geholt, 12 Stunden lang. Einmal und nie wieder.

Wenn es jemanden interessiert: lieber holprig mit einer Datenbank anfangen, als jahrelang Tabellen ansammeln und irgendwann merken, daß man einen Haufen Unsinn eintippt, wenn es keine Integritätsprüfung gibt :oops:

Also: vor allem vielen Dank an RobertG und F3KTotal für die Unterstützung. Die nächsten Fragen kommen bestimmt, aber später :ugeek:

Viele Grüße
Freischreiber

Re: Abfrage mit mehreren Spalten für ein Feld?

Verfasst: Mi 17. Dez 2014, 16:09
von Freischreiber
Hallo,

habe gerade die Abfrage von F3K Total ausprobiert und bin fasziniert. Nur zum Verständnis: auch das sind korrelierende Unterabfragen, oder? Gleich 4 Stück?

Und das LEFT JOIN führt dazu, daß alle Zellen zu einem Datum reinkommen, wenn es zu dem Datum auch nur eine Buchung zu einem Buchungskonto gibt?

Editierbar sind diese Abfragen wohl generell nicht, wegen des JOIN? Ist aber genau richtig für meine Zwecke...

Hin und weg,
Freischreiber

Re: Abfrage mit mehreren Spalten für ein Feld?

Verfasst: Mi 17. Dez 2014, 18:27
von RobertG
Hallo Freischreiber,

das mit dem LEFT JOIN muss sein, damit auf jeden Fall alle Datensätze aus "Buchungen" abgebildet werden.
Die Abfrage ist keine korrelierende Unterabfrage. Vielmehr wird die gleiche Tabelle mehrmals direkt angesprochen und jeweils mit einem Alias versehen. Mit dem Alias "a" spricht Du alle Werte an, die bei "KontoID" = 0 sind. Das geht aus der Bedingung für die Tabelle "a" hervor. "a" hat also nicht so viele Datensätze wie "Buchungen". Würde kein LEDFT JOIN gesetzt, so würde die Abfrage insgesamt nichts anzeigen.

Dass die Abfrage nicht editierbar ist hat viele gründe. Einer ist, dass der Primärschlüssel der verschiedenen Tabellen fehlt. Der andere ist, dass mehrere Tabellen mit einem Alias angesprochen werden. Die Editierbarkeit funktioniert nur dann, wenn lediglich eine Tabelle mit einem alias angesprochen wird und von allen betroffenen Tabellen der Primärschlüssel enthalten ist. Und auch da ist Vorsicht geboten, da manche Rechnungen nicht richtig aktualisiert werden.

Gruß

Robert

Re: Abfrage mit mehreren Spalten für ein Feld?

Verfasst: Do 18. Dez 2014, 10:28
von Freischreiber
Hallo Robert,

ok, dieselbe Tabelle wird viermal abgefragt und jeweils nach einer anderen KontoID gefiltert? Es wird entweder der Betrag oder, wenn keiner da ist, Null angezeigt? Tatsächlich werden ja auch Tage angezeigt, an denen es gar keine Buchung gab für diese vier Konten.

Jetzt habe ich schon wieder das nächste Problem: Weil ich die Abfrage um eine Spalte "Auftragsnummer" aus der t-aufträge erweitern will, mache ich das bisher so:

SELECT "t-aufträge"."ID",
"BUCHUNGEN"."Datum",
"a"."Betrag" "Ein19",
"b"."Betrag" "Ein7" ,
"c"."Betrag" "Aus19" ,
"d"."Betrag" "Aus7"
FROM
"t-aufträge", "BUCHUNGEN"
LEFT JOIN "BUCHUNGEN" AS "a"
ON ("BUCHUNGEN"."ID" = "a"."ID" AND "a"."KontoID" = 0)
LEFT JOIN "BUCHUNGEN" AS "b"
ON ("BUCHUNGEN"."ID" = "b"."ID" AND "b"."KontoID" = 1)
LEFT JOIN "BUCHUNGEN" AS "c"
ON ("BUCHUNGEN"."ID" = "c"."ID" AND "c"."KontoID" = 2)
LEFT JOIN "BUCHUNGEN" AS "d"
ON ("BUCHUNGEN"."ID" = "d"."ID" AND "d"."KontoID" = 3)
WHERE "t-aufträge"."ID" = "Buchungen"."AuftragsID"
ORDER BY
"BUCHUNGEN"."Datum"

Das klappt auch, aber es werden keine Buchungen mit angezeigt, wo AuftragsID leer ist. Solche habe ich aber auch.

Ich habe es versucht mit
LEFT JOIN "BUCHUNGEN" on ("t-aufträge"."ID" = "BUCHUNGEN"."AuftragsID")
anstatt des WHERE

aber dabei stürzt Base ab.
Woran könnte das liegen? Bzw. wie geht es richtig?

Gruß
Freischreiber