私はあなたのスキーマと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
もの。そして、外側の部分はすべてのグループ化を実行します。 結果を見てください
。
結果から列を追加/削除する場合は、内部クエリと外部クエリの両方を変更する必要があることに注意してください。
これがあなたが探していたものであることを願っています。