#sql #postgresql
#sql #postgresql
Вопрос:
У меня есть таблица, состоящая из продуктов, приобретенных клиентами на определенную дату. Сначала я должен найти наименее продаваемый продукт в таблице за все 12 месяцев (независимо от года), а затем найти общий объем продаж (сумму количеств) для этого продукта за этот конкретный месяц. Я выполнил первую часть, которая заключается в поиске наименее продаваемого продукта за разные 12 месяцев. Теперь, как найти общую сумму количеств для этого продукта, встречающихся в таблице за этот конкретный месяц.
Запрос, который находит наименее популярный продукт за все 12 месяцев
with
min_quant_table as (
select distinct month, min(quant) as quant
from myTable
group by month
)
select
distinct month,
prod as least_popular_prod,
quant as least_popular_total_q
from min_quant_table
natural join myTable
Вывод (только для ссылки):
Month Least_Popular_Product Least_Popular_Total_Sum_Quantity
1 Milk 23126
2 Eggs 45514
3 Pepsi 21457
Это рабочий пример для запроса:
http://sqlfiddle.com /#!9/4d756f/2
Комментарии:
1. В вашем вопросе недостаточно полезных деталей, чтобы мы могли вам помочь. Ознакомьтесь с этим сообщением , а затем отредактируйте свой вопрос по мере необходимости.
2. Спасибо за добавление скрипки! Вы отметили свой вопрос postgresql, но предоставили MySQL Fiddle. Какой из них вы на самом деле используете?
3. Кроме того, не могли бы вы, пожалуйста, показать ожидаемый результат, учитывая данные в вашем скрипте?
4. Я делаю это в PostgreSQL. Извините за это, но мне просто нужно было указать общую работу запроса.
Ответ №1:
Я использую в основном T-SQL, но я думаю, что PostgreSQL имеет оконные функции. Ваш запрос выглядит хорошо, я просто добавил функцию ROW_NUMBER () и заказал по минимальному количеству за данный месяц, затем выбрал для этого верхний вариант. Кроме того, я добавил функцию SUM () для количеств каждого продукта за месяц.
Я думаю, что следующее должно быть хорошим или, по крайней мере, указать вам правильное направление.
;with min_quant_table as (
select T.[prod]
, T.[month]
, MIN(T.quant) as min_quant
, SUM(T.quant) as tot_quant
, [rn] = row_number() over(partition by T.[month] order by min(T.quant))
from #_tmp AS T
group by T.prod, T.[month]
)
select abc.[month]
, abc.[prod] as least_popular_prod
, abc.min_quant as least_popular_min_q
, abc.tot_quant as least_popular_total_q
from min_quant_table as abc
where abc.rn = '1'
Тогда ваш результат будет примерно таким:
month least_popular_prod least_popular_min_q least_popular_total_q
1 Coke 1557 1557
2 Milk 126 126
3 Milk 58 58
4 Yogurt 301 1504
5 Milk 1457 1457
6 Yogurt 363 363
7 Yogurt 17 17
8 Milk 1132 1132
9 Bread 42 42
10 Yogurt 730 730
11 Milk 210 2632
12 Pepsi 653 7887