#sql #sql-server
Вопрос:
У меня есть таблица, в которой каждая строка представляет пользователя, а каждый столбец представляет услугу, которую, возможно, нанял клиент. Мне нужно подсчитать, сколько клиентов наняло 1 услугу, сколько наняло 2 и так далее. Не имеет значения, какую услугу вы нанимаете. И там нет столбца идентификаторов.
В Python я смог сделать это с помощью
result = services.count(axis = 1).value_counts()
result = pd.DataFrame(result, columns = ['n_clients'])
где «результат» — это csv-файл с базой данных.
Результат, в данном случае, таков:
n_client | |
---|---|
1 | 928459 |
2 | 280235 |
3 | 53731 |
4 | 16042 |
Изменить: пример базы данных для уточнения:
продукт 1 | продукт 2 | продукт 3 | продукт 4 |
---|---|---|---|
Правда | |||
Правда | Правда | Правда | |
Правда | |||
Правда | Правда | ||
Правда | |||
Правда | |||
Правда | Правда |
В этом случае результат должен выглядеть так:
n_client | |
---|---|
1 | 4 |
2 | 2 |
3 | 1 |
4 | 0 |
Комментарии:
1. Можете ли вы опубликовать свои данные? Таблица с образцами данных?
2. Примеры данных для сопровождения ваших желаемых результатов, пожалуйста!
3. Какое отношение первый набор данных имеет к вопросу? Похоже, однако, что вам нужно сделать, если вы исправите свой дизайн; наличие нескольких
product
столбцов нарушает основные правила нормализации.
Ответ №1:
Похоже, вы хотите просто рассчитать, сколько товаров в строке, а затем сгруппировать по этому числу
SELECT
v.CountProducts
n_client = COUNT(*)
FROM YourTable
CROSS APPLY (VALUES (
CASE WHEN product1 = 'True' THEN 1 ELSE 0 END
CASE WHEN product2 = 'True' THEN 1 ELSE 0 END
CASE WHEN product3 = 'True' THEN 1 ELSE 0 END
CASE WHEN product4 = 'True' THEN 1 ELSE 0 END
) ) v(CountProducts)
GROUP BY
CountProducts;
Комментарии:
1. Этот код в конечном итоге подсчитывает, сколько пользователей имеет каждый продукт, а это не то, что мне нужно. Мне нужно знать, у скольких клиентов есть 1 продукт (независимо от того, что это такое), у скольких-2, у скольких-3 и так далее.
2. Хорошо, я дал вам новое решение