Добавление столбца с указанием «1» или «0» на основе значений из запроса в SQL

#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