2016-10-19 1 views
0

У меня есть следующий SQL:левой присоединиться к MySQL не дает мне ожидаемый результат

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. Например. если у меня есть 5 строк с kulturbez 'E' и 2 строки с kulturbez 'N', каждая строка 'E' появляется дважды, и каждая строка 'N' появляется в 5 раз. Любые предложения о том, как переделать SQL, чтобы суммировать каждую строку с подходящим kulturbez один раз? Спасибо,

Гюнтер

+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 

агрегатных функций игнорируют пустые значения для большей части. (Кроме того, технически ELSE NULL не является обязательным, как это предполагается значение, если ELSE не указан, но это хорошая практика, чтобы сделать ваше намерение ясно.)

Смежные вопросы