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

複雑なMySQLクエリの間違った結果

    まだ完全な情報を提供していません。バッチテーブルはなく、既存のレシピテーブルもありません。とにかく、バッチテーブルの内容は気にしないと思います。名前とIDだけだとしましょう。領収書テーブルには、同じ学生の複数の行があります。これにより、すべてのJOINが原因で、他のテーブルにも複数の行が返されるはずです。したがって、SUM()は、一度だけ合計する必要がある値、つまりopen_balanceを複数回合計します。これは、問題がどこにあるかについての手がかりになる可能性があります。必要な情報をレシートテーブルからサブクエリに移動する必要があると思いますが、DB全体を表示したかどうかはわかりません。クエリからレシートテーブルを削除して、結果をもう一度確認してください。それだけの場合は、そこから何をすべきかを確認するか、少なくとも詳細情報を提供してください。

    編集: クエリは次のようになります:

    SELECT
      b.name  AS batch_name,
      b.id    AS batch_id,
    
      COUNT(DISTINCT s.id)
        AS total_students,
    
      COALESCE( SUM(s.open_bal), 0 )
        AS open_balance,
    
      SUM(  COALESCE(i.reg_fee,   0)
          + COALESCE(i.tut_fee,   0)
          + COALESCE(i.other_fee, 0)
      ) AS gross_fee,
    
      SUM( COALESCE(i.discount, 0) )
        AS discount,
    
      COALESCE( SUM(s.open_bal), 0 )
        + SUM(  COALESCE(i.reg_fee,   0)
              + COALESCE(i.tut_fee,   0)
              + COALESCE(i.other_fee, 0)
          )
        - SUM( COALESCE(i.discount, 0) )
        AS net_payable,
      SUM((SELECT SUM(COALESCE(receipts.reg_fee,   0)
          + COALESCE(receipts.tut_fee,   0)
          + COALESCE(receipts.other_fee, 0)) FROM receipts WHERE receipts.student_id = s.id))
      AS net_recieved,
    
      ( COALESCE( SUM(s.open_bal), 0 )
        + SUM(  COALESCE(i.reg_fee,   0)
              + COALESCE(i.tut_fee,   0)
              + COALESCE(i.other_fee, 0)
          )
        - SUM(  COALESCE(i.discount,  0) )
      ) 
      - SUM((SELECT SUM(COALESCE(receipts.reg_fee,   0)
              + COALESCE(receipts.tut_fee,   0)
              + COALESCE(receipts.other_fee, 0)) FROM receipts WHERE receipts.student_id = s.id)) 
        AS balance_due
    
      FROM batches b
      LEFT JOIN students s ON s.batch      = b.id
      LEFT JOIN invoices i ON i.student_id = s.id
      WHERE s.inactive = 0
      GROUP BY b.name, b.id;
    

    これにより、複数の行にある場合でも、レシートテーブルの学生データが合計され、1行だけが返されます。レシートテーブルへの結合を削除すると、他のテーブルから重複する行が削除されるため、計算が正しく行われるはずです。

    もう1つ-s.inactive = 0があります WHERE句で、この計算に関連していないことを確認してください。

    P.S.どうしてサブクエリが何であるかわからず、そのようなものを書くことになりますか?



    1. Oracleの追加スキーマへのアクセスをユーザーに許可する正しい方法

    2. QUERYパケットの送信中にエラーが発生しました

    3. PostgreSQL9.0でのPgbouncerを使用した接続プール

    4. 大量のデータ(ロギング)用のどのmysqlエンジンですか?