#sql
#sql
Вопрос:
В настоящее время я пытаюсь добавить значение в столбец, указывающий, является ли клиент VIP или нет, VIP-клиенты разместили 10 или более заказов. 1 = VIP, 0 = non-vip.
Я написал этот запрос, который успешно возвращает столбец, содержащий количество заказов для каждого идентификатора клиента.
SELECT *
FROM customer;
SELECT customer.customer_id, customer_name, address_line_1, city, state_province, count(order_header.customer_id) AS ordercount
FROM customer
LEFT JOIN order_header ON customer.customer_id = order_header.customer_id
GROUP BY customer.customer_id;
Как я могу изменить это, чтобы указать «1» для клиентов с> = 10 заказами и «0» для всех остальных?
В этом запросе используется подзапрос, но столбец «ordercount» равен 6 921 (общее количество заказов) для каждой строки.
WITH OrderCountTable AS
(
SELECT customer.customer_id, customer_name, address_line_1, city, state_province, count(order_header.customer_id) AS ordercount
FROM order_header, customer
GROUP BY customer.customer_id
)
SELECT *
FROM OrderCountTable
WHERE ordercount >= 10;
Я в тупике и не уверен, как достичь своей цели, я чувствую, что слишком усложняю это. Любая помощь будет с благодарностью принята.
Обновление # 1 на основе комментария Акины
FROM (SELECT customer.customer_id, customer_name, address_line_1, city, state_province, count(order_header.customer_id) AS ordercount
FROM customer
LEFT JOIN order_header ON customer.customer_id = order_header.customer_id
GROUP BY customer.customer_id) AS vipTable
Это возвращает правильный набор данных, но isVIP имеет значение false в каждой строке. Я что-то потерял?
Комментарии:
1.
FROM order_header, customer
.. и где условие объединения?2. Я удалил конфликтующие теги СУБД. Пожалуйста, добавьте только тег для продукта базы данных, который вы действительно используете.
Ответ №1:
Алгоритм:
SELECT *, COUNT(*) OVER (PARTITION BY customer_id) >= 10 AS isVIP
FROM {tableset with proper joining}
На практике это может быть, например,
SELECT customer.column1, .. , customer.columnN, COUNT(*) >= 10 AS isVIP
FROM customer
LEFT JOIN order_header ON customer.customer_id = order_header.customer_id
GROUP BY customer.column1, .. , customer.columnN
Комментарии:
1. Спасибо за ваш ответ, логика работает, но как мне добавить это к столбцу, указывающему 1 или 0? Мне нужно вернуть все строки в таблице customer, независимо от того, являются ли они VIP или нет. Просто индикатор.
2. @AJHalling Мой запрос не фильтрует строки, поэтому будут отображаться все клиенты. Ответ обновлен.
3. Я только что обновил сообщение своим текущим запросом. Как я уже отмечал, значение isVIP равно false для каждой строки. Я думал, что исправил соединение, я что-то не так сделал?
4. @AJHalling Добавьте в вопрос: СОЗДАЙТЕ ТАБЛИЧНЫЕ скрипты, некоторые образцы данных в качестве ВСТАВКИ (3-4 клиента) и желаемый результат для этих данных (уменьшение количества VIP до 3, чтобы объем данных не был огромным).
Ответ №2:
Решение, которое в итоге сработало:
SELECT customer_id, customer_name, address_line_1, city, state_province, CASE WHEN ordercount >= 10 THEN 1 ELSE 0 END AS is_vip_customer
FROM (SELECT customer.customer_id, customer_name, address_line_1, city, state_province, count(order_header.customer_id) AS ordercount
FROM customer
LEFT JOIN order_header ON customer.customer_id = order_header.customer_id
GROUP BY customer.customer_id) AS vipTable