Как получить доступ к псевдоним колонке?
SELECT `A`.*,
SUM(o.quantity) AS `orders`,
SUM((CASE
WHEN o.date >= ADDDATE(CURRENT_DATE(), -30 +1) THEN o.quantity
ELSE 0
END)) AS `orders_period`,
SUM(s.quantity) AS `sales`,
SUM((CASE
WHEN s.date >= ADDDATE(CURRENT_DATE(), -30 +1) THEN s.quantity
ELSE 0
END)) AS `sales_period`,
ROUND(`sales` / `orders` * 100) AS `buyout`
FROM `data_goods` AS A
LEFT JOIN `data_orders` AS o ON o.wb_code = A.wb_code AND o.user = A.user AND o.key = A.key
LEFT JOIN `data_sales` AS s ON s.wb_code = A.wb_code AND s.user = A.user AND s.key = A.key AND s.sale_id LIKE 'S%'
WHERE A.`user` = '0'
На строке "ROUND(sales / orders * 100) AS buyout" ошибка - нет колонки sales и orders. Хотя они есть в виде alias выше (AS orders, AS sales). Как получить доступ к этим колонкам, что бы взять готовое значение и повторно не использовать функцию SUM()?
Ответы (1 шт):
Автор решения: Лучший в Мире
→ Ссылка
К сожалению, в sql нельзя обратиться к вычисленному столбцу по его псевдониму. Есть 3 варианта:
- повторное использование функции SUM
- CTE (WITH), но насколько мне известно mysql не поддерживает CTE.
- Выполнить подзапрос, например следующим образом:
select prep.*,
ROUND(`prep.sales` / `prep.orders` * 100) AS `buyout` FROM
(SELECT `A`.*,
SUM(o.quantity) AS `orders`,
SUM((CASE
WHEN o.date >= ADDDATE(CURRENT_DATE(), -30 +1) THEN o.quantity
ELSE 0
END)) AS `orders_period`,
SUM(s.quantity) AS `sales`,
SUM((CASE
WHEN s.date >= ADDDATE(CURRENT_DATE(), -30 +1) THEN s.quantity
ELSE 0
END)) AS `sales_period`
FROM `data_goods` AS A
LEFT JOIN `data_orders` AS o ON o.wb_code = A.wb_code AND o.user = A.user AND o.key = A.key
LEFT JOIN `data_sales` AS s ON s.wb_code = A.wb_code AND s.user = A.user AND s.key = A.key AND s.sale_id LIKE 'S%'
WHERE A.`user` = '0') prep