2016-10-19 8 views
0

を与えるものではありません:複数のkulturbezで一致した場合は、私は、次のSQLを持っている私に期待される結果

SELECT t.teilnehmer_id, t.familienname, t.vorname, t.ort, t.ortsteil, t.kontrolle_ertrag, t.kontrolle_1j, t.kontrolle_brache, 
    SUM(fe.nutzflaeche) AS nutzflaeche_ertrag, GROUP_CONCAT(fe.nutzflaeche) AS einzelfl_ertrag, 
    SUM(fp.nutzflaeche) AS nutzflaeche_pflanzj, GROUP_CONCAT(fp.nutzflaeche) AS einzelfl_pflanzj, 
    SUM(fb.nutzflaeche) AS nutzflaeche_brache, GROUP_CONCAT(fb.nutzflaeche) AS einzelfl_brache, 
    SUM(fn.nutzflaeche) AS nutzflaeche_nicht_aush, GROUP_CONCAT(fn.nutzflaeche) AS einzelfl_nicht_aush 
FROM teilnehmer t 
LEFT JOIN anrede a ON (t.anrede_id = a.anrede_id) 
LEFT JOIN antragsform af ON (t.antragsform_id = af.antragsform_id) 
LEFT JOIN bank b ON (t.bank_id = b.bank_id) 
LEFT JOIN flurverzeichnis fe ON (t.teilnehmer_id = fe.teilnehmer_id AND fe.kulturbez = 'E') 
LEFT JOIN flurverzeichnis fp ON (t.teilnehmer_id = fp.teilnehmer_id AND fp.kulturbez = 'P') 
LEFT JOIN flurverzeichnis fb ON (t.teilnehmer_id = fb.teilnehmer_id AND fb.kulturbez = 'B') 
LEFT JOIN flurverzeichnis fn ON (t.teilnehmer_id = fn.teilnehmer_id AND fn.kulturbez = 'N') 
WHERE 1 = 1 
GROUP BY t.teilnehmer_id 
ORDER BY familienname, vorname 

を合計が正しい領域を反映するものではありません。例えば。 kulturbez 'E'と5行、kulturbez 'N'と2行の場合、それぞれの 'E'行が2回表示され、それぞれの 'N'行が5回表示されます。すべての行と一致するkulturbezを1回だけ合計するようにSQLをやり直す方法に関する提案はありますか? おかげで、

ギュンター私のコメントで示されているように

+0

、あなたはテーブルを集約する必要があります*前* 'join'を実行します。それがデカルト積を避ける方法です。 –

+0

多くの場合、1:Nの関係が複雑になるので、集計計算はサブクエリで実行する必要があります。 – Uueerdo

+1

これはLEFT JOINが動作する方法です。結果セットに2x5のレコードが必要です。 –

答えて

1

、避けられない1:Nは、通常、加入適切に集計値を計算するサブクエリを必要とします。しかし、あなたの必要性は、条件付きの集約で解決することができるようにそれはそうのように、見えます:

SELECT t.teilnehmer_id, t.familienname, t.vorname, t.ort, t.ortsteil, t.kontrolle_ertrag, t.kontrolle_1j, t.kontrolle_brache 
    , SUM(CASE WHEN f.kulturbez = 'E' THEN f.nutzflaeche ELSE NULL END) AS nutzflaeche_ertrag 
    , GROUP_CONCAT(CASE WHEN f.kulturbez = 'E' THEN f.nutzflaeche ELSE NULL END) AS einzelfl_ertrag 
    , SUM(CASE WHEN f.kulturbez = 'P' THEN f.nutzflaeche ELSE NULL END) AS nutzflaeche_pflanzj 
    , GROUP_CONCAT(CASE WHEN f.kulturbez = 'P' THEN f.nutzflaeche ELSE NULL END) AS einzelfl_pflanzj 
    , SUM(CASE WHEN f.kulturbez = 'B' THEN f.nutzflaeche ELSE NULL END) AS nutzflaeche_brache 
    , GROUP_CONCAT(CASE WHEN f.kulturbez = 'B' THEN f.nutzflaeche ELSE NULL END) AS einzelfl_brache 
    , SUM(CASE WHEN f.kulturbez = 'N' THEN f.nutzflaeche ELSE NULL END) AS nutzflaeche_nicht_aush 
    , GROUP_CONCAT(CASE WHEN f.kulturbez = 'N' THEN f.nutzflaeche ELSE NULL END) AS einzelfl_nicht_aush 
FROM teilnehmer t 
    LEFT JOIN anrede a ON (t.anrede_id = a.anrede_id) 
    LEFT JOIN antragsform af ON (t.antragsform_id = af.antragsform_id) 
    LEFT JOIN bank b ON (t.bank_id = b.bank_id) 
    LEFT JOIN flurverzeichnis f ON (t.teilnehmer_id = fe.teilnehmer_id) 
WHERE 1 = 1 
GROUP BY t.teilnehmer_id 
ORDER BY familienname, vorname 

集計関数は、ほとんどの部分はNULL値を無視します。 (また、技術的にELSE NULLELSEが指定されていない場合、それは想定値であるとして、任意である;しかし、あなたの意図を明確にすることをお勧めします)この問題を解決するための

関連する問題