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

MySQL SUM()が誤った合計を与える

    aggregate fanout issue 。これは、selectクエリのプライマリテーブルの行数が、結合先のセカンダリテーブルよりも少ない場合に発生します。結合すると、行が重複します。したがって、集計関数が適用されると、それらは余分な行に作用します。

    ここで、プライマリテーブルは、集計関数が適用されるテーブルを指します。あなたの例では、
    * SUM(matters.fee)>>テーブルの集計matters
    * SUM(advicetime*advicefee)>>テーブルの集計actions
    * fixedfee='Y'>>テーブルの条件matters

    ファンアウトの問題を回避するには:
    *常に結合内の最も詳細なテーブルに集計を適用します。
    *2つのテーブルに1対1の関係がない限り、次のフィールドに集計関数を適用しないでください。両方のテーブル。
    *さまざまなサブクエリを使用して集計を個別に取得し、結果を結合します。これはSQLステートメントで実行することも、データをエクスポートしてから実行することもできます。

    クエリ1:

    SELECT SUM(fee) AS totfixed 
    FROM matters 
    WHERE fixedfee='Y'
    

    クエリ2:

    SELECT SUM(actions.advicetime*actions.advicefee) AS totbills 
    FROM matters  
    JOIN actions ON matters.matterid = actions.matterid 
    WHERE matters.fixedfee = 'Y'
    

    Query 1Query 2 ファンアウトに悩まされないでください。この時点で、両方をエクスポートして、結果をphpで処理できます。または、SQLでそれらを組み合わせることができます:

    SELECT query_2.totbills, query_1.totfixed
    FROM (SELECT SUM(fee) AS totfixed 
        FROM matters 
        WHERE fixedfee='Y') query_1,
    
        (SELECT SUM(actions.advicetime*actions.advicefee) AS totbills 
        FROM matters  
        JOIN actions ON matters.matterid = actions.matterid 
        WHERE matters.fixedfee = 'Y') query_2
    

    最後に、SUM キーワードDISTINCTを取りません 。 DISTINCT COUNTでのみ利用可能です およびGROUP_CONCAT 集計関数。以下は無効なSQLの一部です

    SUM(DISTINCT matters.fee) AS totfixed
    



    1. Postgresが列が存在しないと言うのはなぜですか?

    2. Oracleトリガー内で新しい行をXMLに変換します

    3. MicrosoftAccessの5つの必知の利点

    4. SQLServerのバックアップ/復元とデタッチ/アタッチ