Ho esaminato il tuo schema e SQL per un po 'e non capisco bene la tua logica. Le cose come le vedo io:
- hai una serie di transazioni (9 per la precisione);
- per ogni transazione hai i dettagli sul lato di addebito e di credito;
- utilizzando il
account_code
su ogni lato, puoi ottenere informazioni sugli account.
Quindi, per cominciare, andrei in questo modo e creerei una VIEW
, che ti fornirebbe tutte le informazioni necessarie sulle tue transazioni. Ho usato INNER
si unisce qui, poiché credo che ogni transazione deve avere entrambi i lati, debito e credito, e ogni lato, a sua volta, dovrebbe avere un account:
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;
Ora, guardando le tue domande, sembra che tu stia cercando di ottenere un elenco di tutte le operazioni di controparte per ciascun codice account. Non sono sicuro di quale sia lo scopo di questo, ma farei quanto segue:
- selezionato un elenco di codici account univoci;
- creato un elenco aggregato di operazioni lato addebito per ciascun codice conto, dove tale codice era sul lato credito;
- creato lo stesso elenco aggregato per le operazioni lato credito, in cui tale conto era lato debito;
- e metti ogni codice account nel mezzo.
Quindi qualcosa del genere potrebbe fare il lavoro:
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;
Nella parte interna sto simulando FULL OUTER
unisciti unendo altri 2 join, LEFT
e RIGHT
quelli. E la parte esterna esegue tutti i raggruppamenti. Dai un'occhiata al risultato
.
Tieni presente che se desideri aggiungere/rimuovere colonne dal risultato, devi modificare sia le query interne che quelle esterne.
Spero che questo sia quello che stavi cercando.