От известно време разглеждам вашата схема и SQL и не разбирам съвсем логиката ви. Нещата, както ги виждам аз:
- имате набор от транзакции (9, за да бъдем точни);
- за всяка транзакция имате подробности за дебитната и кредитната страна;
- с помощта на
account_code
от всяка страна можете да получите информация за акаунти.
И така, бих тръгнал по този начин като начало и бих създал VIEW
, което ще ви предостави цялата необходима информация за вашите транзакции. Използвал съм INNER
се присъединява тук, тъй като вярвам, че всяка транзакция трябва има и двете, дебитна и кредитна страна, и всяка страна на свой ред трябва да има сметка:
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;
Сега, като гледам вашите заявки, изглежда, че се опитвате да получите списък с всички контрастранични операции за всеки код на акаунт. Не съм сигурен каква е целта на това, но бих направил следното:
- избрахте списък с уникални кодове на сметки;
- създаде обобщен списък с операции от страна на дебита за всеки код на сметка, където този код беше от страната на кредита;
- създаде същия обобщен списък за операции от страна на кредита, където такава сметка е била на страна на дебит;
- и поставете всеки код на акаунт в средата.
Така че нещо подобно може да свърши работа:
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;
Във вътрешната част симулирам FULL OUTER
присъединяване чрез обединяване на 2 други съединения, LEFT
и RIGHT
нечий. А външната част изпълнява всички групировки. Разгледайте резултата
.
Обърнете внимание, че ако искате да добавите/премахнете колони от резултата, трябва да промените както вътрешните, така и външните заявки.
Надявам се, че това е, което търсите.