我已经研究你的模式和 SQL 一段时间了,但我不太明白你的逻辑。我所看到的事情:
- 您有一组交易(准确地说是 9 笔);
- 对于每笔交易,您都有借方和贷方的详细信息;
- 使用
account_code
在每一侧,您都可以获得有关帐户的信息。
所以,我会以这种方式开始并创建一个VIEW
,这将为您提供有关您的交易的所有必要信息。我用过INNER
加入这里,因为我相信每笔交易must有借方和贷方,并且每一方都应该有一个帐户:
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
and RIGHT
那些。外部部分执行所有分组。看看结果.
请注意,如果您想在结果中添加/删除列,则应修改内部查询和外部查询。
我希望这就是您一直在寻找的东西。