Меня попросили создать финансовый отчет, в котором необходимо указать общую ставку комиссии между двумя датами для нескольких «рефереров». Это легкая часть.
Сложность в том, что размер комиссии варьируется в зависимости не только от реферала, но и также от типа реферала , а также от количества рефералов такого типа, которые были сделан данным реферером.
Отслеживание количества рефералов должно учитывать ВСЕ рефералы, а не те, которые находятся в данном диапазоне дат - иными словами, размер комиссии для каждого реферала находится на скользящей шкале и изменяется по мере увеличения их общего количества рефералов. К счастью, для каждого типа реферала существует максимум 3 уровня комиссионных.
Все рефералы хранятся в одной таблице, по 1 строке на каждого реферала, с полем, обозначающим реферала и тип реферала. Пример для иллюстрации:
ID Type Referrer Date
1 A X 01/12/08
2 A X 15/01/09
3 A X 23/02/09
4 B X 01/12/08
5 B X 15/01/09
6 A Y 01/12/08
7 A Y 15/01/09
8 B Y 15/01/09
9 B Y 23/02/09
Ставки комиссий не сохраняются в таблице рефералов - и действительно могут изменяться - вместо этого они сохраняются в таблице рефералов, например:
Referrer Comm_A1 Comm_A2 Comm_A3 Comm_B1 Comm_B2 Comm_B3
X 30 20 10 55 45 35
Y 45 35 25 60 40 30
Рассматривая приведенную выше таблицу рефералов в качестве примера и предполагая, что уровень комиссионных увеличился после того, как рефералы № 1 и 2 (затем остались прежними), при запуске отчета о комиссиях за декабрь 2008 года по февраль 2009 года будет возвращено следующее:
[Редактировать] - чтобы пояснить вышесказанное, ставка комиссии имеет три уровня для каждого типа и каждого реферера, с начальной ставкой Comm_A1 для первой реферальной комиссии, затем Comm_A2 для второй и Comm_A3 для всех последующих рефералов.
Referrer Type_A_Comm Type_A_Ref Type_B_Comm Type_B_Ref
X 60 3 100 2
Y 80 2 100 2
Запуск отчета комиссии за февраль 2009 г. вернет:
Referrer Type_A_Comm Type_A_Ref Type_B_Comm Type_B_Ref
X 10 1 0 0
Y 0 0 40 1
Редактировать вышеупомянутые результаты были скорректированы с моего исходного вопроса, с точки зрения группировки столбцов / строк.
Я вполне уверен, что любое решение будет включать в себя подзапрос (возможно, для каждого типа рефералов), а также какой-то агрегат / Sum If - но я изо всех сил пытаюсь придумать рабочий запрос.
[Редактировать] Я не уверен в написании уравнения моих требований, но я постараюсь перечислить шаги, как я их вижу:
Определите количество предыдущих рефералов для каждого типа и каждого реферала, то есть независимо от диапазона дат.
На основе количества предыдущих рефералов выберите соответствующий уровень комиссии - 0 предыдущий = уровень 1, 1 предыдущий = уровень 2, 2 или более предыдущий = уровень 3
(Примечание: реферер, у которого нет предыдущих рефералов, но, скажем, 3 новых реферала, ожидает комиссию 1 x уровень 1, 1 x уровень 2, 1 x уровень 3 = общая комиссия)
Фильтрация результатов по диапазону дат - так, чтобы можно было определить комиссионные, выплачиваемые за период деятельности.
Возвращает данные со столбцом для реферера и столбцом с общей комиссией для каждого типа рефералов (и в идеале также столбец с количеством для каждого типа рефералов).
Это помогает уточнить мои требования?