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

Mærkelig opførsel af gruppe af i forespørgsel, som skal optimeres

Jeg har kigget på dit skema og SQL i et stykke tid, og jeg forstår ikke helt din logik. Ting, som jeg ser dem:

  • du har et sæt transaktioner (9 for at være præcis);
  • for hver transaktion har du detaljer på debet- og kreditsiden;
  • ved at bruge account_code på hver side kan du få oplysninger om konti.

Så jeg ville gå denne vej til at begynde med og oprette en VIEW , der ville give dig alle de nødvendige oplysninger om dine transaktioner. Jeg har brugt INNER tilslutter sig her, da jeg mener, at hver transaktion skal har begge debet- og kreditsider, og hver side skal til gengæld have en konto:

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;

Når du ser på dine forespørgsler, ser det ud til, at du forsøger at få en liste over alle modsidehandlinger for hver kontokode. Jeg er ikke sikker på, hvad formålet med dette er, men jeg ville gøre følgende:

  • valgte en liste over unikke kontokoder;
  • oprettede en aggregeret liste over operationer på debetsiden for hver kontokode, hvor en sådan kode var på kreditsiden;
  • oprettede den samme aggregerede liste for operationer på kreditsiden, hvor en sådan konto var på debetsiden;
  • og indsæt hver kontokode i midten.

Så noget som dette kan måske gøre jobbet:

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;

I den indre del simulerer jeg FULL OUTER join ved at forene 2 andre joins, LEFT og RIGHT dem. Og den ydre del udfører alle grupperingerne. Tag et kig på resultatet .

Bemærk, at hvis du gerne vil tilføje/fjerne kolonner fra resultatet, skal du ændre både indre og ydre forespørgsler.

Jeg håber, det er det, du har ledt efter.




  1. Oracle:Forskellen mellem NULL og EMPTY streng

  2. I hvilken rækkefølge ændrer Oracle SQL-opdateringssætning kolonneværdier?

  3. Sådan fungerer SQRT() i MariaDB

  4. Beregn afstand givet 2 punkter, breddegrad og længdegrad