Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comportement étrange de Group by dans Query qui doit être optimisé

J'ai examiné votre schéma et SQL pendant un certain temps et je ne comprends pas très bien votre logique. Les choses telles que je les vois :

  • vous avez un ensemble de transactions (9 pour être précis) ;
  • pour chaque transaction, vous avez des détails sur les côtés débit et crédit ;
  • en utilisant le account_code de chaque côté, vous pouvez obtenir des informations sur les comptes.

Donc, j'irais dans cette direction pour commencer et j'ai créé une VIEW , qui vous fournirait toutes les informations nécessaires sur vos transactions. J'ai utilisé INNER rejoint ici, car je crois que chaque transaction doit avoir les deux côtés, débit et crédit, et chaque côté, à son tour, devrait avoir un compte :

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;

Maintenant, en regardant vos requêtes, il semble que vous essayez d'obtenir une liste de toutes les opérations de contrepartie pour chaque code de compte. Je ne sais pas quel est le but de cela, mais je ferais ce qui suit :

  • sélectionné une liste de codes de compte uniques ;
  • créé une liste agrégée des opérations au débit pour chaque code de compte, lorsque ce code était au crédit ;
  • créé la même liste agrégée pour les opérations côté crédit, lorsque ce compte était côté débit ;
  • et placez chaque code de compte au milieu.

Donc, quelque chose comme ça pourrait faire l'affaire :

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;

Dans la partie interne, je simule FULL OUTER rejoindre en unissant 2 autres jointures, LEFT et RIGHT ceux. Et la partie externe effectue tous les regroupements. Regardez le résultat .

Notez que si vous souhaitez ajouter/supprimer des colonnes du résultat, vous devez modifier les requêtes internes et externes.

J'espère que c'est ce que vous cherchiez.