sql >> データベース >  >> RDS >> Mysql

最適化する必要があるQueryでのGroupbyの奇妙な動作

    私はあなたのスキーマと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. コメントはストアドプロシージャのパフォーマンスを妨げる可能性がありますか?

    2. mysqlは動的にテーブルを作成します

    3. null許容列のJSON_extract関数を使用したwhereステートメントは、その列の値がNULLの場合に確認されますか?

    4. 文字列/varcharをMySQLテーブル間で日付に変換する