sql >> Database >  >> RDS >> Mysql

Vreemd gedrag van groeperen door in Query die moet worden geoptimaliseerd

Ik heb een tijdje naar je schema en SQL gekeken en ik begrijp je logica niet helemaal. Dingen zoals ik ze zie:

  • je hebt een reeks transacties (9 om precies te zijn);
  • voor elke transactie heeft u details over de debet- en creditzijde;
  • met behulp van de account_code aan elke kant kunt u informatie over accounts verkrijgen.

Dus ik zou om te beginnen deze kant op gaan en een VIEW . maken , die u alle benodigde informatie over uw transacties zou geven. Ik heb INNER gebruikt sluit zich hier aan, omdat ik vind dat elke transactie moet zowel debet- als creditzijde hebben, en elke zijde moet op zijn beurt een rekening hebben:

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;

Nu, kijkend naar uw vragen, lijkt het erop dat u een lijst probeert te krijgen van alle tegengestelde bewerkingen voor elke accountcode. Ik weet niet zeker wat het doel hiervan is, maar ik zou het volgende doen:

  • een lijst met unieke accountcodes geselecteerd;
  • een geaggregeerde lijst gemaakt van transacties aan de debetzijde voor elke rekeningcode, waar een dergelijke code aan de creditzijde stond;
  • dezelfde geaggregeerde lijst gemaakt voor transacties aan de creditzijde, waar een dergelijke rekening aan debetzijde stond;
  • en zet elke accountcode in het midden.

Dus zoiets als dit zou het werk kunnen doen:

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;

In het binnenste deel simuleer ik FULL OUTER doe mee door 2 andere joins te verenigen, LEFT en RIGHT degenen. En het buitenste deel voert alle groeperingen uit. Bekijk het resultaat .

Houd er rekening mee dat als u kolommen aan het resultaat wilt toevoegen/verwijderen, u zowel innerlijke als uiterlijke query's moet aanpassen.

Ik hoop dat dit is wat je zocht.




  1. SQL-ontwikkelaar verbinden met Oracle 12c

  2. Databasestatistieken SQL Server-update

  3. Voer een SQL-query uit bij het opstarten van de MySQL-service

  4. Splits string in tokens in pl sql