Ошибка в запрос - MySQL
Формулировка задачи:
Всем привет!
Написал запрос, выполнение которого заканчивается ошибкой:
Ошибка:
Ошибку в упор не вижу.. буду весьма признателен за помощь
CREATE TEMPORARY TABLE distribution AS ( SELECT IF ( (ABS(i.forecast_budget - r.budget) < 100000000) OR (i.forecast_budget = 0 AND r.budget = 0), 1 , 1 - (i.forecast_budget - r.budget) / (i.forecast_budget + r.budget) ) AS PRECISION FROM placement_daily_info i JOIN timeslot t ON i.timeslot_id = t.timeslot_id LEFT OUTER JOIN v_placement_result r ON i.placement_uid = r.placement_uid AND i.schedule_uid = r.schedule_uid AND t.start_date = r.date LEFT OUTER JOIN changed_placements cp ON i.placement_uid = cp.placement_uid WHERE i.allocation_type = 3 AND i.timeslot_id = @START AND start_timestamp=0 AND i.placement_uid <> cp.placement_uid );
ERROR 1064 (42000): You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near 'precision FROM placement_daily_info i JOIN timeslot t ON i.timeslot_id = t.times' at line 3
Решение задачи: «Ошибка в запрос»
textual
Листинг программы
CREATE TEMPORARY TABLE distribution AS ( SELECT i.schedule_uid IF(ABS(i.forecast_budget - r.budget) < 100000000 OR (i.forecast_budget=0 AND r.budget=0), 1, 1-ABS(i.forecast_budget - r.budget)/(i.forecast_budget + r.budget)) AS `precision` FROM placement_daily_info i JOIN timeslot t ON i.timeslot_id = t.timeslot_id LEFT OUTER JOIN v_placement_result r ON i.placement_uid = r.placement_uid AND i.schedule_uid = r.schedule_uid AND t.start_date = r.date LEFT OUTER JOIN changed_placements cp ON i.placement_uid = cp.placement_uid WHERE i.allocation_type = 3 AND t.start_date BETWEEN @START AND @END AND start_timestamp=0 AND i.placement_uid <> cp.placement_uid );
Объяснение кода листинга программы
Создание временной таблицы distribution
с использованием следующего SQL-запроса:
- SELECT *
- FROM placement_daily_info i
- JOIN timeslot t ON i.timeslot_id = t.timeslot_id
- LEFT OUTER JOIN v_placement_result r ON i.placement_uid = r.placement_uid AND i.schedule_uid = r.schedule_uid AND t.start_date = r.date
- LEFT OUTER JOIN changed_placements cp ON i.placement_uid = cp.placement_uid
- WHERE i.allocation_type = 3
- AND t.start_date BETWEEN @START AND @END
- AND start_timestamp=0
- AND i.placement_uid <> cp.placement_uid
В данном коде создается временная таблица
distribution
с полями:- schedule_uid
- precision
В поле
precision
вычисляется точность прогнозирования бюджета. Если разница между прогнозным и реальным бюджетом меньше 10 миллионов, то точность равна 1, иначе используется формула для расчета точности прогнозирования. Ключевые условия для включения в таблицу: - allocation_type = 3 (показывается только для определенных типов распределения)
- t.start_date BETWEEN @START AND @END (даты выбираются из заданного диапазона)
- start_timestamp=0 (момент начала временного интервала равен 0)
- i.placement_uid <> cp.placement_uid (исключаются объекты, которые были изменены в других записях)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д