Рассчитывать на диапазон значений в SQL

У меня есть таблица с двумя столбцами: идентификатор клиента и количество приобретенных товаров.

Какой оператор SQL я бы использовал, чтобы узнать, сколько клиентов приобрели 1 или более продуктов, 2 или более продуктов, 3 или более продуктов и т. д.?

Можно ли это сделать БЕЗ использования перекрестных соединений (я использую google bigquery, который этого не поддерживает).


person user2518176    schedule 24.06.2013    source источник


Ответы (3)


Если вам действительно нужно подсчитать количество клиентов, которые покупают «один или более» и «два или более» по отдельности, вам понадобится выражение CASE:

SELECT SUM(CASE WHEN NumOfProducts >= 1 THEN 1 ELSE 0 END) AS Purchased_1_or_more
     , SUM(CASE WHEN NumOfProducts >= 2 THEN 1 ELSE 0 END) AS Purchased_2_or_more
     , SUM(CASE WHEN NumOfProducts >= 3 THEN 1 ELSE 0 END) AS Purchased_3_or_more
     , SUM(CASE WHEN NumOfProducts >= 4 THEN 1 ELSE 0 END) AS Purchased_4_or_more
     , SUM(CASE WHEN NumOfProducts >= 5 THEN 1 ELSE 0 END) AS Purchased_5_or_more
FROM Customers

И так далее для любого количества категорий.

person BellevueBob    schedule 25.06.2013
comment
Да, но я думаю, что плакату это нужно для всех возможных значений N, а не только 1..5 - person aloo; 25.06.2013

Попробуй использовать:

SELECT 
CASE NumOfProducts >= 1 THEN 1
WHEN NumOfProducts >= 2 THEN 2
WHEN NumOfProducts >= 3 THEN 3
ELSE 0
END CASE,
COUNT(CustomerID) AS cnt
FROM Customers
GROUP BY CASE NumOfProducts >= 1 THEN 1
WHEN NumOfProducts >= 2 THEN 2
WHEN NumOfProducts >= 3 THEN 3
ELSE 0
END;
person mirkobrankovic    schedule 24.06.2013
comment
Довольно близко; Я не думаю, что вам нужно GROUP BY COUNT(NumOfProducts), просто GROUP BY NumOfProducts. - person BellevueBob; 25.06.2013
comment
Это вообще не работает. Вопрос в том, сколько клиентов покупают 1 или больше. Это следует подчеркнуть в вопросе. - person aloo; 25.06.2013

Я не верю, что это возможно с использованием прямого SQL без кросс-продукта.

Причина в том, что операция, которую мы хотим выполнить, заключается в использовании «группировать по». Однако способ работы с группировкой заключается в том, что она берет несколько строк и сворачивает их в одну строку, выполняя некоторый совокупный расчет.

Чтобы выполнить такой анализ «один или несколько», одна строка должна быть частью расчета нескольких строк. т. е. строка для пользователя, который приобрел 10 продуктов, должна быть частью строк «1 или более», «2 или более», «3 или более» и т. д. Не существует операции, позволяющей сделать это.

person Omar Ismail    schedule 25.06.2013