Estou analisando seu esquema e SQL há um tempo e não entendo muito bem sua lógica. Coisas como eu as vejo:
- você tem um conjunto de transações (9 para ser preciso);
- para cada transação, você tem detalhes sobre o débito e o crédito;
- usando o
account_code
em cada lado, você pode obter informações sobre contas.
Então, eu iria por este caminho para começar e criei um
VIEW
, que forneceria a você todas as informações necessárias sobre suas transações. Eu usei INNER
junta aqui, pois acredito que cada transação deve ter ambos, débito e crédito, e cada lado, por sua vez, deve ter uma conta: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;
Agora, olhando para suas consultas, parece que você está tentando obter uma lista de todas as operações de balcão para cada código de conta. Eu não tenho certeza qual é o objetivo disso, mas eu faria o seguinte:
- selecionou uma lista de códigos de conta exclusivos;
- criou uma lista agregada de operações de débito para cada código de conta, onde esse código estava no lado de crédito;
- criou a mesma lista agregada para operações de crédito, onde tal conta estava no lado de débito;
- e coloque cada código de conta no meio.
Então, algo assim pode fazer o trabalho:
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;
Na parte interna estou simulando
FULL OUTER
junte-se unindo 2 outras associações, LEFT
e RIGHT
uns. E a parte externa realiza todos os agrupamentos. Dê uma olhada no resultado
. Observe que, se você quiser adicionar/remover colunas do resultado, deverá modificar as consultas internas e externas.
Espero que seja isso que você está procurando.