J'ai examiné votre schéma et SQL pendant un certain temps et je ne comprends pas très bien votre logique. Les choses telles que je les vois :
- vous avez un ensemble de transactions (9 pour être précis) ;
- pour chaque transaction, vous avez des détails sur les côtés débit et crédit ;
- en utilisant le
account_code
de chaque côté, vous pouvez obtenir des informations sur les comptes.
Donc, j'irais dans cette direction pour commencer et j'ai créé une VIEW
, qui vous fournirait toutes les informations nécessaires sur vos transactions. J'ai utilisé INNER
rejoint ici, car je crois que chaque transaction doit avoir les deux côtés, débit et crédit, et chaque côté, à son tour, devrait avoir un compte :
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;
Maintenant, en regardant vos requêtes, il semble que vous essayez d'obtenir une liste de toutes les opérations de contrepartie pour chaque code de compte. Je ne sais pas quel est le but de cela, mais je ferais ce qui suit :
- sélectionné une liste de codes de compte uniques ;
- créé une liste agrégée des opérations au débit pour chaque code de compte, lorsque ce code était au crédit ;
- créé la même liste agrégée pour les opérations côté crédit, lorsque ce compte était côté débit ;
- et placez chaque code de compte au milieu.
Donc, quelque chose comme ça pourrait faire l'affaire :
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;
Dans la partie interne, je simule FULL OUTER
rejoindre en unissant 2 autres jointures, LEFT
et RIGHT
ceux. Et la partie externe effectue tous les regroupements. Regardez le résultat
.
Notez que si vous souhaitez ajouter/supprimer des colonnes du résultat, vous devez modifier les requêtes internes et externes.
J'espère que c'est ce que vous cherchiez.