Mysql
 sql >> база данни >  >> RDS >> Mysql

Странно поведение на Group by в заявката, което трябва да се оптимизира

От известно време разглеждам вашата схема и SQL и не разбирам съвсем логиката ви. Нещата, както ги виждам аз:

  • имате набор от транзакции (9, за да бъдем точни);
  • за всяка транзакция имате подробности за дебитната и кредитната страна;
  • с помощта на account_code от всяка страна можете да получите информация за акаунти.

И така, бих тръгнал по този начин като начало и бих създал VIEW , което ще ви предостави цялата необходима информация за вашите транзакции. Използвал съм INNER се присъединява тук, тъй като вярвам, че всяка транзакция трябва има и двете, дебитна и кредитна страна, и всяка страна на свой ред трябва да има сметка:

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;

Сега, като гледам вашите заявки, изглежда, че се опитвате да получите списък с всички контрастранични операции за всеки код на акаунт. Не съм сигурен каква е целта на това, но бих направил следното:

  • избрахте списък с уникални кодове на сметки;
  • създаде обобщен списък с операции от страна на дебита за всеки код на сметка, където този код беше от страната на кредита;
  • създаде същия обобщен списък за операции от страна на кредита, където такава сметка е била на страна на дебит;
  • и поставете всеки код на акаунт в средата.

Така че нещо подобно може да свърши работа:

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;

Във вътрешната част симулирам FULL OUTER присъединяване чрез обединяване на 2 други съединения, LEFT и RIGHT нечий. А външната част изпълнява всички групировки. Разгледайте резултата .

Обърнете внимание, че ако искате да добавите/премахнете колони от резултата, трябва да промените както вътрешните, така и външните заявки.

Надявам се, че това е, което търсите.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. получаване на новия идентификатор на ред от pySpark SQL запис в отдалечен mysql db (JDBC)

  2. Как да премахнете водещите и крайните празни места в MySQL

  3. Ред на изтриване с ограничения на външния ключ,

  4. Доктрина 2 Близка връзка

  5. Как мога да ИЗБЕРЯ редове с MAX (стойност на колона), DISTINCT по МНОГО колони в SQL