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 1
&Query 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