sql >> Databasteknik >  >> RDS >> Mysql

Konstigt beteende hos gruppen av i fråga som behöver optimeras

Jag har tittat på ditt schema och SQL ett tag och jag förstår inte riktigt din logik. Saker som jag ser dem:

  • du har en uppsättning transaktioner (9 för att vara exakt);
  • för varje transaktion har du information på debet- och kreditsidan;
  • med account_code på varje sida kan du få information om konton.

Så jag skulle gå den här vägen till att börja med och skapa en VIEW , som skulle ge dig all nödvändig information om dina transaktioner. Jag har använt INNER går med här, eftersom jag tror att varje transaktion måste har båda debet- och kreditsidorna, och varje sida ska i sin tur ha ett 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;

Nu när du tittar på dina frågor verkar det som att du försöker få en lista över alla motsidans operationer för varje kontokod. Jag är inte säker på vad som är syftet med detta, men jag skulle göra följande:

  • valt en lista med unika kontokoder;
  • skapat en aggregerad lista över operationer på debetsidan för varje kontokod, där sådan kod fanns på kreditsidan;
  • skapat samma aggregerade lista för transaktioner på kreditsidan, där ett sådant konto var på debetsidan;
  • och placera varje kontokod i mitten.

Så något sådant här kan göra 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 inre delen simulerar jag FULL OUTER gå med genom att förena 2 andra kopplingar, LEFT och RIGHT ettor. Och den yttre delen utför alla grupperingar. Ta en titt på resultatet .

Observera att om du vill lägga till/ta bort kolumner från resultatet bör du ändra både inre och yttre frågor.

Jag hoppas att det här är vad du har letat efter.




  1. Sätt att ta reda på / hämta Windows-användarnamn i Oracle APEX

  2. Inga dubbletter i SQL-fråga

  3. Genvägstangent för att ändra lagrad procedur i ssms

  4. Finns det någon hash-funktion i PL/SQL?