#mysql #sql #dynamicquery
Вопрос:
Рассмотрим следующие таблицы данных.
1. Таблица клиентов
ID | Имя | onboarded_date дата загрузки |
---|---|---|
1 | xxxx | 2021-10-01 |
2 | yyyy | 2021-10-02 |
3 | zzzz | 2021-10-05 |
2. Таблица доходов
ID | customer_id пользователь_id | Дата | выручка |
---|---|---|---|
1 | 1 | 2021-10-01 | 100 |
1 | 2 | 2021-10-02 | 300 |
3 | 2 | 2021-10-03 | 200 |
4 | 3 | 2021-10-07 | 100 |
5 | 2 | 2021-10-10 | 100 |
6 | 3 | 2021-10-12 | 300 |
7 | 3 | 2021-10-14 | 600 |
Как мы можем написать единый динамический запрос, который вычисляет для каждого клиента доход, полученный за первые 10 дней с даты ввода (учитывая дату ввода в качестве даты начала)
Примечание: Дата начала и дата окончания для каждого клиента для расчета общего дохода здесь являются динамическими
Ожидаемый результат:
ID | Имя | start_date | конечная дата | итоговый доход |
---|---|---|---|---|
1 | xxxx | 2021-10-01 | 2021-10-10 | 100 |
2 | yyyy | 2021-10-02 | 2021-10-11 | 600 |
3 | zzzz | 2021-10-05 | 2021-10-14 | 1000 |
Комментарии:
1. Объединение по идентификатору клиента и дате между onboarded_date и onboarded_date плюс длина периода, затем агрегировать?
Ответ №1:
Вместо динамического запроса вы можете использовать запрос с параметром.
select c.id,
c.name,
c.onboard_date start_date,
date_format(c.onboard_date DAYS, '%Y-%m-%d') end_date,
sum(revenue) revenue
from customers c
join revenue r
on r.customer_id = c.id
where r.date between c.onboard_date and c.onboard_date DAYS
group by c.id,
c.name,
c.onboard_date;
В вашем коде вы можете просто заменить «ДНИ» некоторым параметром привязки.
Подробности см. в dbfiddle
Комментарии:
1. Спасибо за помощь, это легко обобщает необходимый результат