Tôi đã xem xét lược đồ và SQL của bạn trong một thời gian và tôi không hiểu logic của bạn. Những điều tôi thấy:
- bạn có một tập hợp các giao dịch (chính xác là 9);
- đối với mỗi giao dịch, bạn có thông tin chi tiết về ghi nợ và ghi có;
- sử dụng
account_code
ở mỗi bên, bạn có thể nhận được thông tin về tài khoản.
Vì vậy, tôi sẽ đi theo cách này cho người mới bắt đầu và tạo một VIEW
, điều đó sẽ cung cấp cho bạn tất cả các thông tin cần thiết cho các giao dịch của bạn. Tôi đã sử dụng INNER
tham gia ở đây, vì tôi tin rằng mỗi giao dịch phải có cả hai bên ghi nợ và ghi có, và mỗi bên, lần lượt, phải có một tài khoản:
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;
Bây giờ, khi xem xét các truy vấn của bạn, có vẻ như bạn đang cố gắng lấy danh sách tất cả các thao tác đối chiếu cho từng mã tài khoản. Tôi không chắc mục đích của việc này là gì, nhưng tôi sẽ làm như sau:
- đã chọn một danh sách các mã tài khoản duy nhất;
- đã tạo một danh sách tổng hợp các hoạt động bên ghi nợ cho từng mã tài khoản, trong đó mã đó ở bên ghi có;
- đã tạo cùng một danh sách tổng hợp cho các hoạt động bên ghi có, trong đó tài khoản đó ở bên ghi nợ;
- và đặt từng mã tài khoản ở giữa.
Vì vậy, một cái gì đó như thế này có thể thực hiện công việc:
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;
Ở phần bên trong, tôi đang mô phỏng FULL OUTER
tham gia bằng cách hợp nhất 2 liên kết khác, LEFT
và RIGHT
những cái. Và phần bên ngoài thực hiện tất cả các nhóm. Hãy xem kết quả
.
Lưu ý rằng nếu bạn muốn thêm / xóa các cột khỏi kết quả, bạn nên sửa đổi cả truy vấn bên trong và bên ngoài.
Tôi hy vọng đây là những gì bạn đang tìm kiếm.