Я наткнулся на этот вопрос и пытался понять, как ответ , заданный там, на самом деле преобразует данные.
Таблица ввода
+---------+-------+---------------+
| user_id | State | Subscriptions |
+---------+-------+---------------+
| 1 | LA | 4 |
| 2 | LA | 4 |
| 3 | LA | 12 |
| 4 | LA | 12 |
| 5 | LA | 8 |
| 6 | LA | 3 |
| 7 | NY | 14 |
| 8 | NY | 15 |
| 9 | NY | 3 |
| 10 | NY | 2 |
| 11 | NY | 4 |
| 12 | NY | 12 |
| 13 | OH | 6 |
| 14 | OH | 8 |
| 15 | OH | 2 |
| 16 | OH | 3 |
+---------+-------+---------------+
Таблица вывода
+--------------------+----+----+----+
| Subscription_Range | LA | NY | OH |
+--------------------+----+----+----+
| 1 to 4 | 3 | 3 | 2 |
| 5 to 11 | 1 | 0 | 2 |
| 12 to 15 | 2 | 3 | 0 |
+--------------------+----+----+----+
Ответ от Гордон Линофф :
select (case when subscriptions <= 4 then '1 to 4'
when subscriptions <= 11 then '5 to 11'
when subscriptions <= 15 then '12 to 15'
end) as subscription_range,
sum(case when state = 'LA' then 1 else 0 end) as LA,
sum(case when state = 'NY' then 1 else 0 end) as NY,
sum(case when state = 'OH' then 1 else 0 end) as OH
from t
group by (case when subscriptions <= 4 then '1 to 4'
when subscriptions <= 11 then '5 to 11'
when subscriptions <= 15 then '12 to 15'
end)
order by min(subscriptions);
Я хотелпонять основы выполнения этого запроса.
Например:
- Когда будет выбрана первая строка, будет ли сначала проверяться столбец
Subscriptions
?(Поскольку это первое, что проверяется с помощью case
в запросе.) - После проверки выясняется, что ему следует присвоить
1 to 4
.Что дальше? - Будет ли проверяться столбец состояния?Оказывается, это
LA
, но я не понимаю, как происходит дальнейшее выполнение.Я пытаюсь представить, как формируется таблица перед агрегацией.
Работает ли SQL построчно?Например, каждая строка выбирается из базы данных, и соответствующая часть запроса применяется к каждому столбцу?(Например, case
применяется к столбцу Subscriptions
в этом случае.)