Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Comportamento estranho do grupo na consulta que precisa ser otimizado


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.