Hi zusammen
Für eine Buchhaltung hab ich eine Tabelle transactions, welche Buchungen speichern kann. Die Buchungen werden folgendermassen gespeichert:
Beispiel für normale Buchung (2 Datensätze):
booking_id / betrag / text / person / konto / gegenkonto
52 / 100.00 / Beispieltext / 2 / 1010 / 4310
52 / -100.00 / Beispieltext / 2 / 4310 / 1010
Beispiel für eine Sammelbuchung (3 Datensätze)
53 / -100.00 / Bsp B / 2 / 1010 / 0
53 / 60.00 / Bsp B / 2 / 4310 / 1010
53 / 40.00 / Bsp B / 2 / 4320 / 1010
Ich möchte nun eine Zwei-Spalten-Darstellung (Soll/Haben) mit SQL erreichen:
booking_id / soll / haben / betrag / text / person
52 / 1010 / 4310 / 100.00 / Beispieltext / 2
53 / ----- / 1010 / 100.00 / Bsp B / 2
53 / 4310 / ----- / 60.00 / Bsp B / 2
53 / 4320 / ----- / 40.00 / Bsp B / 2
Für diese Darstellung könnte ich folgende Query benützen:
Code:
SELECT booking_id,
IF(betrag>0,konto,IF((SELECT count(id) FROM transactions WHERE booking_id = t1.booking_id GROUP BY text, person_id LIMIT 1)=2,gegenkonto,'---')) AS soll,
IF(betrag<0,konto,IF((SELECT count(id) FROM transactions WHERE booking_id = t1.booking_id GROUP BY text, person_id LIMIT 1)=2,gegenkonto,'---')) AS haben,
ABS(betrag) AS betrag,
text, person_id
FROM transactions AS t1
WHERE (SELECT count(id) FROM transactions WHERE booking_id = t1.booking_id GROUP BY text, person_id LIMIT 1) > 2 OR t1.betrag > 0;
Um Zwischen Normal- und Sammelbuchung zu unterscheiden benutze ich die Subquery, welche die Anzahl unterschiedlicher Transaktionen pro booking_id zählt. Gibt es einen Weg, diese Subquery zu umgehen, um die Abfrage performanter zu machen? (Vor allem wird ja die gleiche Subquery 3 Mal benützt..)
Vielen Dank
Grüsse,
Janosh