Как получить доступ к псевдоним колонке?

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 варианта:

  1. повторное использование функции SUM
  2. CTE (WITH), но насколько мне известно mysql не поддерживает CTE.
  3. Выполнить подзапрос, например следующим образом:
    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
→ Ссылка