Я застрял с проблемой, когда у меня есть две таблицы, одна по месяцам, а другая по неделям. Вот формат таблиц:
Table1
Customer Date1 Sales
1 Jan2018 1110
1 Feb2018 1245
1 Mar2018 1320
1 Apr2018 1100
...
Table2
Customer Date2
1 01Jan2018
1 08Jan2018
1 15Jan2018
1 22Jan2018
1 29Jan2018
1 05Feb2018
1 12Feb2018
1 19Feb2018
1 26Feb2018
1 05Mar2018
...
Я хочу создать новый столбец для продаж в Table2, который будет содержать дезагрегированные значения продаж из Table1. Я хочу разделить продажи на количество дней в этом месяце, а затем соответственно присвоить значения неделям. Таким образом, продажи на неделе 01 января 2018 составят (1110/31) * 7. Недели, находящиеся в переходном периоде, получат значения обоих месяцев. Например, 29 января 2018 года имеет 3 дня в январе 2018 года и 4 дня в феврале 2018 года. Продажи за один день в январе 2018 года составили 31 октября 2018 года, а продажи за один день в феврале 2018 года - 1245/28.
Таким образом, продажи на неделе 29 января 2018 будут 3 * (1110/31) + 4 * (1245/28).
Я хочу сделать это для каждого отдельного клиента.
Итоговая таблица должна быть
Result Table
Customer Date Sales
1 01Jan2018 250.6 i.e (1110/31)*7
1 08Jan2018 250.6
1 15Jan2018 250.6
1 22Jan2018 250.6
1 29Jan2018 282.27
1 05Feb2018 311.25
1 12Feb2018 311.25
1 19Feb2018 311.25
1 26Feb2018 133.39 + 170.32
Спасибо!
Исходя из вашего желания, вы не получите точной картины продаж, если будете переводить деньги из месяца в неделю. Вы разделяете его на равные пропорции или применяете вес? Как рассчитать вес? Таким образом, в ваших расчетах будет двусмысленность. Это означает, что он не покажет правильный результат. Почему бы вам не объединить еженедельные продажи с ежемесячными продажами и не изменить расчеты?
У вас есть SAS ETS? Я считаю, что и PROC EXPAND, и / или TIMESERIES сделают это за вас, если у вас есть этот модуль.

В программировании DATA Step вам понадобятся некоторые данные FORWARD вместо данных LAG. Прямое значение может быть эмулировано путем создания представления для тех же данных, начиная с одного наблюдения вперед (obs = 2). После понимания семантики переименования это всего лишь вопрос простой «бухгалтерии».
data customer_months;
attrib Customer length=8 Date1 informat=monyy. format=monyy7.; input
Customer Date1 Sales; datalines;
1 Jan2018 1110
1 Feb2018 1245
1 Mar2018 1320
1 Apr2018 1100
run;
* week data, also with computation for month the week is in;
data customer_weeks;
attrib Customer length=8 Date2 informat=date9. format=date9.; input
Customer Date2;
Date1 = intnx('month', Date2, 0);
datalines;
1 01Jan2018
1 08Jan2018
1 15Jan2018
1 22Jan2018
1 29Jan2018
1 05Feb2018
1 12Feb2018
1 19Feb2018
1 26Feb2018
1 05Mar2018
run;
* next months sales keyed on prior month value;
data customer_next_months_view / view=customer_next_months_view;
set customer_months;
Date1 = intnx('month',Date1,-1); * the month this record will be a forward for;
rename Sales=Sales_next_month;
if _n_ > 1;
run;
* merge original and forward data, rename for making clear the variable roles;
data combined;
length disag_sales 8;
merge
customer_months (rename=Sales=Sales_this_month)
customer_next_months_view
customer_weeks
;
by Date1;
days_in_this_month = intck('day',intnx('month',Date1,0),intnx('month',Date1,1));
days_in_next_month = intck('day',intnx('month',Date1,1),intnx('month',Date1,2));
day_rate_this_month = Sales_this_month / days_in_this_month;
day_rate_next_month = Sales_next_month / days_in_next_month;
if Date2 then
if month(Date2) = month(Date2+6) then
week_days_this_month = 7;
else
week_days_this_month = intck('day', Date2, intnx('month', Date2, 1));
week_days_next_month = 7 - week_days_this_month;
dollars_this_week_this_month = week_days_this_month * day_rate_this_month;
dollars_this_week_next_month = week_days_next_month * day_rate_next_month;
* desired estimated disaggregated sales;
disag_sales = sum (dollars_this_week_this_month,dollars_this_week_next_month);
run;
Как работает 29 января 2018 года 3 дня в январе 2018 года и 4 дня в феврале 2018 года.?