Вот частичный ответ о том, как выполнить это для отдельной акции.
Сначала создайте таблицу для нужных месяцев и заполните ее.Это дает нам кое-что для перебора.
create table stock_months (
int month_num not null
);
insert into stock_months values (4), (5), (6), (7), (8), (9), (10);
Теперь мы можем выбрать месяцы из этой таблицы и left outer join
с stocks
, чтобы получить все месяцы.
select stock_item, month_num, stock
from stock_months sm
left outer join stocks s
on sm.month_num = s.month and s.stock_item = 'pepsi'
+------------+-----------+-------+
| stock_item | month_num | stock |
+------------+-----------+-------+
| pepsi | 4 | 100 |
| pepsi | 5 | 120 |
| pepsi | 9 | 80 |
| NULL | 6 | NULL |
| NULL | 7 | NULL |
| NULL | 8 | NULL |
| NULL | 10 | NULL |
+------------+-----------+-------+
Мы можем использовать переменные, чтобы запомнить значения предыдущей строки.
select
case when stock_item is null then
@stock_item
else
@stock_item := stock_item
end as stock_item,
month_num,
case when stock is null then
@stock
else
@stock := stock
end as stock
from stock_months sm
left outer join stocks s
on sm.month_num = s.month and s.stock_item = 'pepsi'
order by month_num;
+------------+-----------+-------+
| stock_item | month_num | stock |
+------------+-----------+-------+
| pepsi | 4 | 100 |
| pepsi | 5 | 120 |
| pepsi | 6 | 80 |
| pepsi | 7 | 80 |
| pepsi | 8 | 80 |
| pepsi | 9 | 80 |
| pepsi | 10 | 80 |
+------------+-----------+-------+
Почему это не сработало?Потому что select
перебирает результаты объединения в любом порядке.Тогда это сортирует.В этом случае сначала были строки с stock_item
.
Сначала нужно отсортировать соединенные строки.Мы можем сделать это, выбрав из подвыбора, который уже в порядке.
select
case when stock_item is null then
@stock_item
else
@stock_item := stock_item
end as stock_item,
month_num,
case when stock is null then
@stock
else
@stock := stock
end as stock
from (
select stock_item, month_num, stock
from stock_months sm
left outer join stocks s
on sm.month_num = s.month and s.stock_item = 'pepsi'
order by month_num
) stocks;
+------------+-----------+-------+
| stock_item | month_num | stock |
+------------+-----------+-------+
| pepsi | 4 | 100 |
| pepsi | 5 | 120 |
| pepsi | 6 | 120 |
| pepsi | 7 | 120 |
| pepsi | 8 | 120 |
| pepsi | 9 | 80 |
| pepsi | 10 | 80 |
+------------+-----------+-------+
Я не уверен, как перейти отсюда ко всем элементам на складе.