Я понимаю, что порядок или исполнение выглядит следующим образом
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE or WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
из этого SO ответа , а также Документация Microsoft
Однако в моем запросе ниже столбец total
построен на лету, который позже используется в предложении having
. Это будет означать, что having
выполняет ПОСЛЕ выбора, а не раньше, потому что столбец 'total' не существует в таблице orders
.
Я неправильно понимаю или просто что-то упустил?
Запрос
select customer_id,
sum(CASE
WHEN product_name = 'A' THEN 1
WHEN product_name = 'B' THEN 1
WHEN product_name = 'C' THEN -1
ELSE 0 END
) as total
from Orders
group by customer_id
having total > 1;
Таблица заказов
+------------+-------------+--------------+
| order_id | customer_id | product_name |
+------------+-------------+--------------+
| 10 | 1 | A |
| 20 | 1 | B |
| 30 | 1 | D |
| 40 | 1 | C |
| 50 | 2 | A |
| 60 | 3 | A |
| 70 | 3 | B |
| 80 | 3 | D |
| 90 | 4 | C |
+------------+-------------+--------------+
Результат
+-------------+-------+
| customer_id | total |
+-------------+-------+
| 3 | 2 |
+-------------+-------+