KorsaR-ZN
@KorsaR-ZN

Запрос с подсчетом суммы по объединяющей таблице с between?

Добрый день.

Необходимо получить всех аудиторов, которые связаны с определенной возрастной группой, при условие что в их связи суммарное кол-во в каждой группе больше (колонка value таблица 3);

Проблема из-за таблицы 4, т.к она при объедение дает дубли на таблицу 2, и отсюда при дальнейшем объедение и суммирование получается сумма у учетом дублей, ни группировка на DISTINCT - дубли не убирает. А если без суммирование вывести результат, но с группировкой или DISTINCT, то дубли пропадают, но не при суммирование. Как быть?

1. аудиторы (auditors)
Ее структура тут не важна...

2. возрастные группы (audiences)
dfc72290f620472ca971006db4be8333.png
3. карта связи возрастной группы и аудитора (auditors_audiences_map)
f448e66e24cd4ddf8588eafcd64060ec.png
4. раскрытия промежутка возрастной группы (audiences_range_map)
fccd5558c9954c63874b56a5f1d339d3.png

Примеры запросов, с группировкой и без..

(
    SELECT am2.id, SUM(am2.value)
    
    FROM auditors_audiences_map AS am2 
    
    LEFT JOIN audiences_range_map AS a2 ON (a2.value BETWEEN 13 AND 17) 
    
    WHERE am2.audience_id=a2.audience_id

    GROUP BY am2.audience_id
)


(
    SELECT am2.id, am2.value
    
    FROM auditors_audiences_map AS am2 
    
    LEFT JOIN audiences_range_map AS a2 ON (a2.value BETWEEN 13 AND 17) 
    
    WHERE am2.audience_id=a2.audience_id

    GROUP BY am2.audience_id
)


результаты выполнения:

1. С суммированием и группировкой
c11db67ad1da4f7bba9a0b919bff73dd.png

2. Без суммирование и группировкой
f27b14322b1d43289d8ce9c82cb82711.png

3. Без суммирование и без группировки
868f7eeecb8b45798081d578bae6c3a7.png

Как быть, не пойму в чем проблема...
Явно при суммирование, группировка не учитывается, но как избежать, не могу придумать :(
  • Вопрос задан
  • 2673 просмотра
Решения вопроса 1
KorsaR-ZN
@KorsaR-ZN Автор вопроса
Решение нашлось, не знаю, на сколько правильно, но работает.
Если у кого-то будет более правильный и оптимизированный вариант, пожалуйста расскажите, а мое решение выглядит так:

SELECT SUM(am3.value) FROM 
(
    SELECT am2.id, am2.value
    
    FROM auditors_audiences_map AS am2 
    
    LEFT JOIN audiences_range_map AS a2 ON (a2.value BETWEEN 13 AND 17) 
    
    WHERE am2.audience_id=a2.audience_id

    GROUP BY am2.audience_id
) AS am3
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы