Ik heb een tijdje naar je schema en SQL gekeken en ik begrijp je logica niet helemaal. Dingen zoals ik ze zie:
- je hebt een reeks transacties (9 om precies te zijn);
- voor elke transactie heeft u details over de debet- en creditzijde;
- met behulp van de
account_code
aan elke kant kunt u informatie over accounts verkrijgen.
Dus ik zou om te beginnen deze kant op gaan en een VIEW
. maken , die u alle benodigde informatie over uw transacties zou geven. Ik heb INNER
gebruikt sluit zich hier aan, omdat ik vind dat elke transactie moet zowel debet- als creditzijde hebben, en elke zijde moet op zijn beurt een rekening hebben:
CREATE VIEW all_transactions AS
SELECT ti.transaction_id tid, ti.voucher_no tvno, ti.voucher_date tvdt,
ds.account_code dacc, ds.amount damt, da.name daname, da.type dat,
cs.account_code cacc, cs.amount camt, ca.name caname, ca.type cat
FROM transaction_info ti
JOIN debit_side ds ON ds.transaction_id_dr = ti.transaction_id
JOIN credit_side cs ON cs.transaction_id_cr = ti.transaction_id
JOIN accounts da ON da.code = ds.account_code
JOIN accounts ca ON ca.code = cs.account_code;
Nu, kijkend naar uw vragen, lijkt het erop dat u een lijst probeert te krijgen van alle tegengestelde bewerkingen voor elke accountcode. Ik weet niet zeker wat het doel hiervan is, maar ik zou het volgende doen:
- een lijst met unieke accountcodes geselecteerd;
- een geaggregeerde lijst gemaakt van transacties aan de debetzijde voor elke rekeningcode, waar een dergelijke code aan de creditzijde stond;
- dezelfde geaggregeerde lijst gemaakt voor transacties aan de creditzijde, waar een dergelijke rekening aan debetzijde stond;
- en zet elke accountcode in het midden.
Dus zoiets als dit zou het werk kunnen doen:
SELECT group_concat(dacc) "D-Accounts",
group_concat(damt) "D-Amounts",
group_concat(daname) "D-Names",
group_concat(dvdt) "D-Dates",
code, name,
group_concat(cacc) "C-Accounts",
group_concat(camt) "C-Amounts",
group_concat(caname) "C-Names",
group_concat(cvdt) "C-Dates"
FROM (
SELECT atl.dacc, atl.damt, atl.daname, atl.tvdt dvdt,
a.code, a.name, NULL cacc, NULL camt, NULL caname, NULL cvdt
FROM accounts a
LEFT JOIN all_transactions atl ON atl.cacc = a.code
UNION ALL
SELECT NULL, NULL, NULL, NULL, a.code, a.name,
atr.cacc, atr.camt, atr.caname, atr.tvdt cvdt
FROM accounts a
RIGHT JOIN all_transactions atr ON atr.dacc = a.code
) full_join
GROUP BY code, name
ORDER BY code;
In het binnenste deel simuleer ik FULL OUTER
doe mee door 2 andere joins te verenigen, LEFT
en RIGHT
degenen. En het buitenste deel voert alle groeperingen uit. Bekijk het resultaat
.
Houd er rekening mee dat als u kolommen aan het resultaat wilt toevoegen/verwijderen, u zowel innerlijke als uiterlijke query's moet aanpassen.
Ik hoop dat dit is wat je zocht.