Mysql
 sql >> Database >  >> RDS >> Mysql

Strano comportamento di Raggruppa per in Query che deve essere ottimizzato

Ho esaminato il tuo schema e SQL per un po 'e non capisco bene la tua logica. Le cose come le vedo io:

  • hai una serie di transazioni (9 per la precisione);
  • per ogni transazione hai i dettagli sul lato di addebito e di credito;
  • utilizzando il account_code su ogni lato, puoi ottenere informazioni sugli account.

Quindi, per cominciare, andrei in questo modo e creerei una VIEW , che ti fornirebbe tutte le informazioni necessarie sulle tue transazioni. Ho usato INNER si unisce qui, poiché credo che ogni transazione deve avere entrambi i lati, debito e credito, e ogni lato, a sua volta, dovrebbe avere un account:

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;

Ora, guardando le tue domande, sembra che tu stia cercando di ottenere un elenco di tutte le operazioni di controparte per ciascun codice account. Non sono sicuro di quale sia lo scopo di questo, ma farei quanto segue:

  • selezionato un elenco di codici account univoci;
  • creato un elenco aggregato di operazioni lato addebito per ciascun codice conto, dove tale codice era sul lato credito;
  • creato lo stesso elenco aggregato per le operazioni lato credito, in cui tale conto era lato debito;
  • e metti ogni codice account nel mezzo.

Quindi qualcosa del genere potrebbe fare il lavoro:

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;

Nella parte interna sto simulando FULL OUTER unisciti unendo altri 2 join, LEFT e RIGHT quelli. E la parte esterna esegue tutti i raggruppamenti. Dai un'occhiata al risultato .

Tieni presente che se desideri aggiungere/rimuovere colonne dal risultato, devi modificare sia le query interne che quelle esterne.

Spero che questo sia quello che stavi cercando.