Я создаю панель инструментов, которая, среди прочего, показывает, какой доход торговый представитель получил за первый месяц после прихода в компанию.
Это будет основано на таблице, которую я создаю с помощью SQL. Простейшая версия этой таблицы будет такой:
дата (которая будет каждый день недели), имя представителя, доход, полученный с момента их присоединения.
Это будет увеличиваться кумулятивно (поэтому, когда вы выбираете дату на панели инструментов, вы видите общую сумму, сгенерированную до этого дня).
Поскольку нас интересует только доход, полученный за первый месяц, я хочу, чтобы моя таблица доходов кумулятивно увеличивалась до тех пор, пока мы не дойдем до 1 месяца с даты начала, а затем, каким бы ни было это максимальное число, просто повторяется до конца. моя колонка. Таким образом, после первого месяца, любую дату, которую вы выберете на панели инструментов, вы все равно увидите только номер месяца 1. Я хочу сделать это таким образом, так как я думаю, что это будет проще сделать в SQL, а не в моем инструменте панели инструментов, так как тогда мне придется передавать больше данных и выполнять дальнейшие вычисления там же.
Для этого я сначала создал подзапрос:
(SELECT date, rep name, sum(revenue) as revenue
FROM rev Group BY 1,2) as a
Так что это дает мне доход каждый день для представителя.
Затем я запрашиваю этот подзапрос, присоединяясь к таблице, указывающей дату начала. Итак, мой новый запрос начинается так:
SELECT a.date, a.rep name,
SUM(CASE WHEN (a.date- b.join_date < 1 month) then sum(a.revenue)
Теперь я застрял на части ELSE. Я хочу разделить здесь?
Мои мысли примерно такие:
ELSE sum(revenue) partition over(rep name, add_months(join_date, 1) order by date asc)
Но я не думаю, что это имеет большой смысл?
По сути, то, что я хочу видеть в качестве окончательного результата, таково. Чтобы таблица была короткой, я предположу, что мне нужен доход в первую неделю их присоединения (а не за месяц, как я на самом деле хочу):
В этом примере я притворяюсь, что торговый представитель начал зарабатывать деньги в первый день их присоединения, то есть 19 февраля 2020 года. То, что у меня есть в первых трех столбцах, — это текущий результат моего подзапроса (индивидуальные суммы, которые они генерировали каждый день). Я хочу объединить это с другим запросом, который дает мне 4-й столбец. Я надеюсь, что это делает вещи немного яснее!
Решение проблемы
Как прокомментировал Фред, условное агрегирование в промежуточной сумме должно быть тем, что вам нужно:
SELECT date, rep_name, sum(revenue) as revenue
,sum(CASE WHEN a.date <= add_months(b.join_date, 1) then sum(revenue) END)
over (partition by rep_name
order by date
rows unbounded preceding) as monthly_rev
FROM rev as a
join...
Group BY 1,2
Комментариев нет:
Отправить комментарий