Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Perilaku Aneh Grup oleh dalam Query yang perlu dioptimalkan

Saya telah melihat skema dan SQL Anda untuk sementara waktu dan saya tidak begitu mengerti logika Anda. Hal-hal seperti yang saya lihat:

  • Anda memiliki serangkaian transaksi (tepatnya 9);
  • untuk setiap transaksi Anda memiliki detail di sisi debit dan kredit;
  • menggunakan account_code di setiap sisi, Anda dapat memperoleh info tentang akun.

Jadi, saya akan menggunakan cara ini sebagai permulaan dan membuat VIEW , yang akan memberi Anda semua informasi yang diperlukan tentang transaksi Anda. Saya telah menggunakan INNER bergabung di sini, karena saya yakin setiap transaksi harus memiliki keduanya, sisi debit dan kredit, dan masing-masing sisi, pada gilirannya, harus memiliki akun:

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;

Sekarang, melihat kueri Anda, tampaknya Anda mencoba untuk mendapatkan daftar semua operasi kontra-sisi untuk setiap kode akun. Saya tidak yakin apa tujuannya, tetapi saya akan melakukan hal berikut:

  • memilih daftar kode akun unik;
  • membuat daftar gabungan operasi sisi debit untuk setiap kode akun, di mana kode tersebut berada di sisi kredit;
  • membuat daftar gabungan yang sama untuk operasi sisi kredit, di mana akun tersebut berada di sisi debit;
  • dan letakkan setiap kode akun di tengah.

Jadi sesuatu seperti ini mungkin berhasil:

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;

Di bagian dalam saya mensimulasikan FULL OUTER gabung dengan menyatukan 2 join lainnya, LEFT dan RIGHT yang. Dan bagian luar melakukan semua pengelompokan. Lihat hasilnya .

Perhatikan, bahwa jika Anda ingin menambah/menghapus kolom dari hasil, Anda harus memodifikasi kueri dalam dan luar.

Saya harap ini yang Anda cari.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JPA @NamedQuery dengan bitwise AND (&) sebagai kriteria

  2. MySQL ERROR 1290 (HY000) --secure-file-priv option

  3. Memilih subset baris dari tabel PHP

  4. Bagaimana saya bisa mendapatkan persentase total baris dengan mysql untuk grup?

  5. Mendapatkan perbedaan waktu yang tepat dari bidang datetime MYSQL