Saya telah melihat skema dan SQL Anda untuk sementara waktu dan saya tidak begitu mengerti logika Anda. Hal-hal seperti yang saya lihat:
- Anda memiliki serangkaian transaksi (tepatnya 9);
- untuk setiap transaksi Anda memiliki detail di sisi debit dan kredit;
- menggunakan
account_code
di setiap sisi, Anda dapat memperoleh info tentang akun.
Jadi, saya akan menggunakan cara ini sebagai permulaan dan membuat VIEW
, yang akan memberi Anda semua informasi yang diperlukan tentang transaksi Anda. Saya telah menggunakan INNER
bergabung di sini, karena saya yakin setiap transaksi harus memiliki keduanya, sisi debit dan kredit, dan masing-masing sisi, pada gilirannya, harus memiliki akun:
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;
Sekarang, melihat kueri Anda, tampaknya Anda mencoba untuk mendapatkan daftar semua operasi kontra-sisi untuk setiap kode akun. Saya tidak yakin apa tujuannya, tetapi saya akan melakukan hal berikut:
- memilih daftar kode akun unik;
- membuat daftar gabungan operasi sisi debit untuk setiap kode akun, di mana kode tersebut berada di sisi kredit;
- membuat daftar gabungan yang sama untuk operasi sisi kredit, di mana akun tersebut berada di sisi debit;
- dan letakkan setiap kode akun di tengah.
Jadi sesuatu seperti ini mungkin berhasil:
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;
Di bagian dalam saya mensimulasikan FULL OUTER
gabung dengan menyatukan 2 join lainnya, LEFT
dan RIGHT
yang. Dan bagian luar melakukan semua pengelompokan. Lihat hasilnya
.
Perhatikan, bahwa jika Anda ingin menambah/menghapus kolom dari hasil, Anda harus memodifikasi kueri dalam dan luar.
Saya harap ini yang Anda cari.