Ошибка указывает на то, что ваш ORDER BY
является неоднозначным, вам нужно заключить в скобки ваши операторы SELECT
, чтобы указать MySQL, как его применять.
Из MySQL Docs :
Чтобы использовать предложение ORDER BY или LIMIT для
сортировать или ограничивать весь результат UNION,
заключить в скобки индивидуальный SELECT
заявления и разместить заказ BY или
LIMIT после последнего.
Итак, учитывая ваш запрос, поместите каждый запрос в скобки и поместите ORDER BY
вне их:
SELECT date , month , Sum(fact_1) , ( 2 / Sum(fact_2) ) , 2
FROM(
(SELECT time.date, time.month, time.year,
MAX(sales_fact.sell_out_value) as fact_1, 0 as fact_2
FROM sales_fact, time_dim as time
WHERE time.id=sales_fact.time_id AND time.date="2008-01-01"
GROUP BY time.date)
UNION
(SELECT time.date, time.month, time.year, 0 as fact_1,
MAX(sales_target_fact.sell_out_target) as fact_2
FROM sales_target_fact, time_dim as time
WHERE time.id=sales_target_fact.time_id AND time.date="2008-01-01"
GROUP BY time.date)
ORDER BY time.year
) as Combined_Table GROUP BY date ORDER BY year
В качестве альтернативы, если вы хотите, чтобы ORDER BY
применялся к каждому утверждению индивидуально перед UNION
, поместите ORDER BY
в скобках для каждого из двух SELECT
выражений.
SELECT date , month , Sum(fact_1) , ( 2 / Sum(fact_2) ) , 2
FROM(
(SELECT time.date, time.month, time.year,
MAX(sales_fact.sell_out_value) as fact_1, 0 as fact_2
FROM sales_fact, time_dim as time
WHERE time.id=sales_fact.time_id AND time.date="2008-01-01"
GROUP BY time.date
ORDER BY time.year)
UNION
(SELECT time.date, time.month, time.year, 0 as fact_1,
MAX(sales_target_fact.sell_out_target) as fact_2
FROM sales_target_fact, time_dim as time
WHERE time.id=sales_target_fact.time_id AND time.date="2008-01-01"
GROUP BY time.date
ORDER BY time.year)
) as Combined_Table GROUP BY date ORDER BY year