SQL с 2 колонками: Общая комиссия и комиссия от 3 лучших пользователей - PullRequest
2 голосов
/ 23 января 2020

Я пытаюсь запустить статистику SQL в моей базе данных. У меня есть список операций, состоящий из даты, идентификатора пользователя и суммы.

Я пытаюсь добиться того, чтобы в результате было 3 столбца:

  • Месяц (2020-01)
  • Общий объем продаж (xxx.xx)
  • Общий объем продаж трех крупнейших спонсоров этого месяца. (xxx.xx)

Вот что я написал до сих пор и где я застрял:

SELECT DATE_FORMAT(`date_bill`, '%Y-%m') as money_month, SUM(`commission`) as 'Money' 
FROM `money` 
LEFT JOIN(
    SELECT SUM(`commission`) as value, DATE_FORMAT(`date_bill`, '%Y-%m') as top3_month 
    FROM `money` 
    WHERE DATE_FORMAT(`date_bill`, '%Y-%m') = money_month 
    GROUP BY `user_id` 
    ORDER BY VALUE DESC 
    LIMIT 3
) as Top3 
WHERE Top3.top3_month = money.money_month
GROUP BY DATE_FORMAT(`date_bill`, '%Y%m') 
ORDER BY money_month DESC

Я застрял здесь и сейчас. Любые советы о том, где посмотреть или что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Довольно сложное требование.

Регистрация не для этого. Также вы говорите, что Ответ из GMB не сработал.

Что вам нужно, это

select left(date_bill, 7) as money_month, sum(commission) as money, money_top_3
 from money
 group by left(date_bill, 7)
 order by ... desc

, тогда как money_top_3 можно получить из подзапрос, у которого тоже есть подзапрос.

select sum(money) from
 (select left(date_bill, 7) as money_month, user_id, sum(commission) as money 
     from money tmoney
     where money_month= left(money.date_bill, 7)
     group by user_id
     order by money desc limit 3 ) subq

Но это тоже не сработает, если использовать базу данных date_bill для денег, где допускается предложение подзапроса и NOT внутри подзапрос.

Лучше было бы выполнить вторую часть (подзапрос с другим подпунктом) как временную таблицу, а затем выполнить первый запрос, чтобы соединиться с временной таблицей.

0 голосов
/ 23 января 2020

Если ваша версия MySQL / MariaDB поддерживает оконные функции, вы можете сделать это с двумя уровнями агрегирования следующим образом:

select
    mon,
    sum(com) total_commissions,
    sum(case when rn <= 3 then com end) top3_comissions
from (
    select 
        date_format(`date_bill`, '%Y-%m') mon,
        user_id,
        sum(commission) com,
        row_number() 
            over(partition by date_format(`date_bill`, '%Y-%m') order by sum(commission) desc) rn
    from money
    group by mon, user_id
) t
group by mon
order by mon

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

...