2016-10-26 9 views
1

Когда я запускаю инструкцию SELECT, она запускает часть IFNULL трижды и часть SUM CASE дважды. Я знаю, что это связано со слишком большим количеством ВЛЕВОГО ПРИСОЕДИНЕНИЯ в заявлении. Но не удалось найти решение проблемы.MySQL SELECT выполняется несколько раз

Трудно объяснить проблему, поэтому я включил ссылку sqlfiddle.

SQLFIDDLE

SELECT 
IFNULL(SUM(d.quantity),0) as dispatch, 
SUM(CASE WHEN t.valuefor='alpha' THEN t.quantity ELSE 0 END) as alpha, 
SUM(CASE WHEN t.valuefor='beta' THEN t.quantity ELSE 0 END) as beta 
FROM conversion as c 
LEFT JOIN sale as s ON s.conversionid = c.id 
LEFT JOIN dispatch as d ON d.saleid = s.id 
LEFT JOIN test as t ON t.conversionid = c.id 

Выходной ток

dispatch alpha beta 
1800  1400 80 

Желаемая Выход

dispatch alpha beta 
600   700  40 
+0

Ваши соединения вызывают декартовский продукт. Вам нужно выполнить агрегацию * до *, чтобы сделать соединения. –

+0

Yeh, эта часть, я выясню, что это должны быть эти утверждения соединения. Но не могу понять, как решить проблему. –

ответ

2

Вам нужно отделить суммированием значений отправки, а тестовые значения - что-то подобное может дать ответ:

Select A.dispatch, 
SUM(CASE WHEN t.valuefor='alpha' THEN t.quantity ELSE 0 END) as alpha, 
SUM(CASE WHEN t.valuefor='beta' THEN t.quantity ELSE 0 END) as beta 
FROM(
    SELECT sum(quantity) AS dispatch, c.id 
    FROM conversion as c 
    LEFT JOIN sale as s ON s.conversionid = c.id 
    LEFT JOIN dispatch as d ON d.saleid = s.id 
    GROUP BY d.saleid) A 
LEFT JOIN test as t ON t.conversionid = A.id 
group by A.id; 

Внутренний подзапрос суммирует значения отправки, а затем объединяет тестовые суммы.

+0

В запросе есть ошибка. Когда вы добавляете больше значений в таблицу преобразования, вы заметите, что не отображает результаты для каждого идентификатора конверсии. –

+0

См. Мое редактирование, которое может исправить. Если не обновить sqlfiddle с дополнительными данными, и я снова посмотрю – PaulF

1

Попробуйте этот путь:

SELECT 
    IFNULL(SUM(d.quantity),0) as dispatch, 
    SUM(t.alpha) as alpha, 
    SUM(t.beta) as beta 
FROM conversion as c 
LEFT JOIN sale as s ON s.conversionid = c.id 
LEFT JOIN (
    SELECT saleid, SUM(quantity) AS quantity 
    FROM dispatch 
    GROUP BY saleid) as d ON d.saleid = s.id 
LEFT JOIN (
    SELECT conversionid, 
      SUM(CASE WHEN valuefor='alpha' THEN quantity ELSE 0 END) as alpha, 
      SUM(CASE WHEN valuefor='beta' THEN quantity ELSE 0 END) as beta 
    FROM test 
    GROUP BY conversionid) as t ON t.conversionid = c.id 

Этот запрос выполняет агрегацию на таблицах dispatch, test, перед эти таблицы используются в LEFT JOIN операций.

Demo here

+0

В запросе есть ошибка. Когда вы добавляете больше значений в таблицу преобразования, вы заметите, что не отображает результаты для каждого идентификатора конверсии. –

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