получить данные за прошлый месяц, если в следующем месяце нет данных - PullRequest
0 голосов
/ 16 октября 2018

Я хочу получить данные за прошлый месяц, если в следующем месяце нет данных.предположим, что данные:

stock_item month stock
pepsi      4     100
pepsi      5     120
pepsi      9     80
coca cola  4     90
coca cola  6     100
coca cola  8     120

выходные данные должны быть такими:

stock_item month stock
pepsi      4     100
pepsi      5     120
pepsi      6     120
pepsi      7     120
pepsi      8     120
pepsi      9     80
pepsi      10    80
coca cola  4     90
coca cola  5     90
coca cola  6     100
coca cola  7     100
coca cola  8     120
coca cola  9     120
coca cola  10    120

Месяц находится между 4 и 10, потому что финансовый год в Индии начинается в апреле, а текущий месяц - октябрь, поэтому 10.

1 Ответ

0 голосов
/ 16 октября 2018

Вот частичный ответ о том, как выполнить это для отдельной акции.

Сначала создайте таблицу для нужных месяцев и заполните ее.Это дает нам кое-что для перебора.

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 |
+------------+-----------+-------+

Я не уверен, как перейти отсюда ко всем элементам на складе.

...