Как считать и группировать ненулевые элементы в SQL Server?

#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. Хорошо, я дал вам новое решение