#mysql #sql
Вопрос:
в SQL мне нужно получить сумму взрослых и детей за календарный день из диапазона даты начала и даты окончания бронирования.
Так, например, 03.09.2021 мне нужно будет добавить 2 взрослых из бронирования 178458, 4 взрослых из бронирования 178459, 3 взрослых из бронирования 178460 и 1 взрослого из бронирования 178462, что даст мне в общей сложности 10 взрослых.
Как я могу это получить? Большое спасибо
Комментарии:
1. Отметьте свой вопрос в базе данных, которую вы используете. У вас есть под рукой таблица календаря?
2. Создайте справочную таблицу календаря/cte. ПОЖАЛУЙСТА, ПРИСОЕДИНЯЙТЕСЬ, ГРУППИРУЙТЕСЬ ПО.
3. У меня нет под рукой таблицы календаря @GordonLinoff
4. Доброе утро @jarlh, не могли бы вы быть более откровенными? Спасибо
5. выбирать… ИЗ бронирований СПРАВА ПРИСОЕДИНЯЙТЕСЬ к календарю в календарной дате между датой начала и датой окончания …
Ответ №1:
Решение:
https://dbfiddle.uk/?rdbms=sqlserver_2019amp;fiddle=c97858b3ddeb079cb27a5c0846a8b884
create table bookings (booking_id int, stay_date_start date, stay_date_finish date, number_adults int, number_children int);
insert into bookings values (178458, '2021-09-01', '2021-09-07', 2, 3);
insert into bookings values (178459, '2021-09-03', '2021-09-06', 4, 2);
insert into bookings values (178460, '2021-09-02', '2021-09-10', 3, 1);
insert into bookings values (178461, '2021-09-04', '2021-09-09', 2, 2);
insert into bookings values (178462, '2021-09-01', '2021-09-11', 1, 0);
select * from bookings;
create table cte_dates (day date);
insert into cte_dates values ('2021-09-01');
insert into cte_dates values ('2021-09-02');
insert into cte_dates values ('2021-09-03');
insert into cte_dates values ('2021-09-04');
insert into cte_dates values ('2021-09-05');
insert into cte_dates values ('2021-09-06');
insert into cte_dates values ('2021-09-07');
insert into cte_dates values ('2021-09-08');
insert into cte_dates values ('2021-09-09');
insert into cte_dates values ('2021-09-10');
insert into cte_dates values ('2021-09-11');
select * from cte_dates;
select c.day, sum(number_adults) as 'number_adults', sum(number_children) as 'number_children'
from bookings as b
right join cte_dates as c
on c.day
between b.stay_date_start and b.stay_date_finish
group by c.day;