Рассчитать лучшую продажу между несколькими продавцами - PullRequest
0 голосов
/ 27 сентября 2018

Я использую Postgre.Допустим, есть 5 продавцов.Каждый месяц продажи регистрируются в базе данных следующим образом (userId: 6, январь: 10000 $, февраль: 20000 $, март: 10000 $ ..., декабрь: 50000 $, год: 2018)

Мне нужночтобы рассчитать, возможно, только с одним запросом, лучшую продажу каждого месяца в одном массиве этого формата: (январь: 15000 $, февраль: 30000 $, март: 40000 $, год: 2018), мне не нужен идентификатор пользователя.Мне просто нужно сравнивать каждый объем продаж по месяцам и отображать наилучшую сумму ...

На данный момент у меня есть этот код, который хорошо работает и дает мне 6 продаж в месяц за данный год:

SELECT date_trunc('month', date_vente) AS txn_month, sum(prix_vente) as  monthly_sum,count(prix_vente) AS monthly_count
FROM crm_vente 
WHERE 1=1 
AND date_part('year', date_vente) =  2018 
AND id_user = 6
GROUP BY txn_month ORDER BY txn_month 

Интересно, мог бы кто-нибудь сказать мне, какую технологию я мог бы использовать, чтобы получать максимальные продажи каждые 12 месяцев между 5 сотрудниками.

Может ли я использовать представление?Должен ли я сделать цикл for в php, с каждым из продаж пользователей в месяц, а затем сделать своего рода сравнительный массив?

Нет необходимости давать мне полное разрешение, но, возможно, совет, как это сделать, прямо с postgre?Потому что мое единственное решение на данный момент - это использовать php и делать нехороший код.

Хороший день, плохая проверка в понедельник

Извините за мой английский

1 Ответ

0 голосов
/ 28 сентября 2018
WITH monthly_sales AS (
SELECT 
date_trunc('month', date_vente) AS txn_month, 
user_id,
sum(prix_vente) as monthly_sum,
FROM crm_vente 
WHERE 1=1 
AND date_part('year', date_vente) =  2018 
GROUP BY txn_month, user_id
ORDER BY txn_month, user_id),

rank_monthly_sales_by_user_id AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY txn_month ORDER BY monthly_sum DESC) AS rank
FROM monthly_sales)

SELECT
txn_month,
monthly_sum
FROM rank_monthly_sales_by_user_id
WHERE rank = 1
ORDER BY txn_month ASC;

Во-первых, вам нужно получить общее количество за месяц по пользователю.Это основной подзапрос, который называется ежемесячные продажиMonthly_sales суммирует продажи каждого пользователя по месяцам

Далее, чтобы получить лучшего пользователя за каждый месяц с точки зрения их общих продаж, вы должны ранжировать строки, возвращенные предыдущим подзапросом.Это уменьшается на ROW_NUMBER ()

ROW_NUMBER () получает номер строки в указанном окне, в этом случае он упорядочивает строки из month_sales для каждого месяца (он начинает упорядочивать снова с 1 каждый месяц).Оператор PARTITION BY - это окно, в котором мы хотим выполнить подсчет строк, здесь месяц, так как мы хотим упорядочить продажи нашего user_id по месяцам.Оператор ORDER BY говорит, как упорядочить строки от 1 до n.Мы используем month_sum в порядке убывания.Таким образом, самая высокая месячная сумма равна 1, самая низкая - 6

. Следующий запрос выбирает только строки из rank_monthly_sales_by_user_id, которые являются верхними продажами за месяц (WHERE rank = 1)

Это оставляет насс выводом где строка - это месяц, с самой высокой продажей за этот месяц

Дайте мне знать, если вам нужна помощь с

...