Подсчет повторений комбинаций в SQL

#sql #group-by #count #aggregate-functions

#sql #группировка по #подсчитывать #агрегатные функции

Вопрос:

У меня есть список предметов (например, рубашки, топы, брюки, adidas, nike, puma, губная помада, средство для мытья лица и т. Д.), И я классифицировал их как (рубашки, топ, брюки = одежда, nike, adidas, puma = обувь, губная помада и т. Д. = макияж) и годы в форматекак это 2017-01-01. Я хочу узнать, сколько раз в одну и ту же дату было два типа покупок, например, если я купил косметику и одежду в 2018-02-01, тогда я хочу посчитать это как 1 для категории «макияж одежда», если я купил обувь и косметику в 2017-09-06, тогда я хочу посчитать, чтокак 1 для категории «обувь макияж»

Как я могу это сделать?

У меня есть следующая таблица с именем Items:

 Year | Purchases | 
------------------
2017-02-01 | makeup
2018-10-01 | shoes
2019-03-01 | makeup
2017-11-01 | shoes
2017-02-01 | clothing
2016-01-01 | shoes
2018-10-01 | clothing
2017-11-01 | clothing
2019-01-01 | makeup
2016-01-01 | makeup
  

Желаемый результат выглядит примерно так:

 Year | Purchases        | Count
-----------------------
2016 | Shoes   makeup   |  1
2017 | Makeup  clothing |  1
2017 | shoes   Clothing |  2
2018 | Shoes   clothing |  1
...
  

Комментарии:

1. Пожалуйста, укажите имя базы данных в вашем вопросе. Функции SQL сильно зависят от поставщика.

Ответ №1:

Вот один из подходов, использующих самосоединение и агрегирование:

 select extract(year from t1.date) yr, t1.purchases purchases_1, t2.purchases purchases_2, count(*) cnt
from mytable t1
inner join mytable t2 on t2.date = t1.date and t2.purchases < t1.purchases
group by extract(year from t1.date), t1.purchases, t2.purchases
  

Для каждого года подсчитывается, сколько раз два продукта появлялись в одну и ту же дату.

Примечания:

  • нелогично, что должен вызываться столбец, в котором хранится дата year ; я переименовал его date в запрос

  • вы не указали, какую базу данных вы используете; extract() для получения года каждой даты используется стандартная функция — не все базы данных поддерживают эту функцию, но у всех есть альтернативы

  • запрос помещает элементы в два отдельных столбца — вы можете объединить их в один и тот же столбец, который вам нравится