Jeg har kigget på dit skema og SQL i et stykke tid, og jeg forstår ikke helt din logik. Ting, som jeg ser dem:
- du har et sæt transaktioner (9 for at være præcis);
- for hver transaktion har du detaljer på debet- og kreditsiden;
- ved at bruge
account_code
på hver side kan du få oplysninger om konti.
Så jeg ville gå denne vej til at begynde med og oprette en VIEW
, der ville give dig alle de nødvendige oplysninger om dine transaktioner. Jeg har brugt INNER
tilslutter sig her, da jeg mener, at hver transaktion skal har begge debet- og kreditsider, og hver side skal til gengæld have en konto:
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;
Når du ser på dine forespørgsler, ser det ud til, at du forsøger at få en liste over alle modsidehandlinger for hver kontokode. Jeg er ikke sikker på, hvad formålet med dette er, men jeg ville gøre følgende:
- valgte en liste over unikke kontokoder;
- oprettede en aggregeret liste over operationer på debetsiden for hver kontokode, hvor en sådan kode var på kreditsiden;
- oprettede den samme aggregerede liste for operationer på kreditsiden, hvor en sådan konto var på debetsiden;
- og indsæt hver kontokode i midten.
Så noget som dette kan måske gøre jobbet:
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;
I den indre del simulerer jeg FULL OUTER
join ved at forene 2 andre joins, LEFT
og RIGHT
dem. Og den ydre del udfører alle grupperingerne. Tag et kig på resultatet
.
Bemærk, at hvis du gerne vil tilføje/fjerne kolonner fra resultatet, skal du ændre både indre og ydre forespørgsler.
Jeg håber, det er det, du har ledt efter.