Pro c sql: создание представления путем копирования данных из одного года в другой - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть проблема, для которой я не смог найти решение в Stackoverflow или где-либо еще, и я не уверен, если это возможно, решить с помощью SAS pro c sql.

My Цель состоит в том, чтобы создать представление (z) на основе набора данных (a) и представления (b). Проблема заключается в том, что (а) можно обновить до фактического года в начале года, тогда как (б) можно обновить только позднее в этом году. Тем не менее, я хочу, чтобы моя точка зрения (z) представила данные в начале года (даже если это временно), что, естественно, возможно только при наличии данных как из (a), так и (b). Итак, я хочу, чтобы представление (z) использовало последний доступный год из (b) и использовало его так, как если бы это был фактический год (поэтому в основном для вменения данных в (b) для самого последнего года данных в (a). Я попытался сделать это с помощью следующего кода, но он не сработал так, как я хочу:

proc sql;
create view x1 as 
   select ste.jahr, ste.gnr, ste.einwg, stk.stkabs
      from           d18.fg_gji_steinh as ste
                           inner join 
                        d18.fg_gji_skraft as stk
                                    on 
                        case when exists (select stkabs from d18.fg_gji_skraft where ste.jahr=stk.jahr)
                        then ste.jahr=stk.jahr and ste.gnr=stk.gnr
                        else input(ste.jahr,4.)=input(stk.jahr,4.)+1 and ste.gnr=stk.gnr
                        end 
                        order by ste.jahr, ste.gnr ;   
quit;

Он выдает ожидаемые данные за первый и последний год, но не за годы между поскольку для одного наблюдения получаются две строки. Первое наблюдение содержит данные за фактический год, а другое наблюдение содержит данные за прошлый год.

Кто-нибудь знает, как решить эту проблему?

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

Похоже, вы хотите просто присоединиться дважды. Один, где ГОД совпадает, а другой, где ГОД + 1 совпадает. Затем используйте функцию COALESCE (), чтобы выбрать значение для отчета. Так что-то вроде

select a.jahr
     , a.gnr
     , a.einwg
     , coalesce(b.stkabs,c.stkabs) as stkabs
from d18.fg_gji_steinh a
left join d18.fg_gji_skraft b
  on a.gnr=b.gnr and a.jahr=b.jahr
left join d18.fg_gji_skraft c
  on a.gnr=c.gnr and a.jahr=(c.jahr + 1)
0 голосов
/ 12 февраля 2020

Вот мое решение, использующее некоторые подзапросы. Может быть, есть более простой способ сделать это?

Я смоделировал различные территориальные уровни с помощью формата. Он принимает в качестве аргумента территориальный год и номер муниципалитета и выдает полученный муниципальный номер нового территориального уровня.

/* 
   Input data to view: tables fg_gji_steinh and fg_gji_skraft, 
   the tax units and defintive tax force, respectively.
   Data in fg_gji_skraft is missing in the last two years. This has to be filled
   by the view with the last known data, in this example from year 2019.
   Table fg_gji_steinh has to be joined with table fg_gji_skraft.
*/

data work.fg_gji_steinh;
   jahr='2018'; gnr='1001'; einwg=1.5; output;
   jahr='2018'; gnr='1002'; einwg=1.8; output;
   jahr='2018'; gnr='1003'; einwg=2.0; output;

   jahr='2019'; gnr='1001'; einwg=1.6; output;
   jahr='2019'; gnr='1002'; einwg=1.8; output;
   jahr='2019'; gnr='1003'; einwg=2.0; output;

   jahr='2020'; gnr='1002'; einwg=1.8; output;
   jahr='2020'; gnr='1010'; einwg=1.9; output;

   jahr='2021'; gnr='1010'; einwg=2.1; output;
run;

data work.fg_gji_skraft;
   jahr='2018'; gnr='1001'; stkabs=10; output;
   jahr='2018'; gnr='1002'; stkabs=20; output;
   jahr='2018'; gnr='1003'; stkabs=30; output;

   jahr='2019'; gnr='1001'; stkabs=10; output;
   jahr='2019'; gnr='1002'; stkabs=22; output;
   jahr='2019'; gnr='1003'; stkabs=35; output;

   jahr='2020'; gnr='1002'; stkabs=.; output;
   jahr='2020'; gnr='1010'; stkabs=.; output;

   jahr='2021'; gnr='1010'; stkabs=.; output;
run;

/*
   Municipal merger format. 
   We assume that in 2018 there exist three municipalities: 1001, 1002, 1003.
   The same in 2019.
   At begin of year 2020 municipalities 1001 and 1003 merge to 1010.
   At begin of year 2021 municipalities 1002 and 1010 merge to 1010.
*/
proc format;
   value $cjrgdgdf
   '20201001'='1010'
   '20201002'='1002'
   '20201003'='1010'
   '20201010'='1010'
   '20211001'='1010'
   '20211002'='1010'
   '20211003'='1010'
   '20211010'='1010'
   ;
run;

/* definitive tax force */
%macro select1;
   select
      jahr,
      gnr,
      stkabs
   from fg_gji_skraft
%mend select1;

/* join tax units and definitive tax force */
%macro select2;
   select
      t1.*,
      t2.stkabs
   from
      fg_gji_steinh as t1
   left join
      ( %select1 ) as t2
   on t1.jahr=t2.jahr and t1.gnr=t2.gnr
%mend select2;

/* last data year of definitive tax force*/
%macro select3;
   select max (jahr) as maxjahr
   from ( %select1 )
   where stkabs ne .
%mend select3;

/* last known definitive tax force */
%macro select4;
   select
      t1.jahr,
      t1.gnr,
      t1.stkabs
   from ( %select2 ) as t1
   where t1.jahr=( %select3 )
%mend select4;

/* convert last known tax force to territorial level of first missing data year. */
%macro select5a;
   select
      put(input(jahr,4.)+1,4.) as jahr,
      put(calculated jahr||gnr,$cjrgdgdf.) as gnr,
      sum(stkabs) as stkabs
   from ( %select4 )
   group by jahr, calculated gnr
%mend select5a;

/* convert last known tax force to territorial level of second missing data year. */
%macro select5b;
   select
      put(input(jahr,4.)+2,4.) as jahr,
      put(calculated jahr||gnr,$cjrgdgdf.) as gnr,
      sum(stkabs) as stkabs
   from ( %select4 )
   group by jahr, calculated gnr
%mend select5b;

/* join definitive tax force with provisional tax force. */
%macro select6;
   select
      t1.jahr,
      t1.gnr,
      coalesce(t1.stkabs, t2.stkabs, t3.stkabs) as stkabs
   from
      (%select2 ) as t1
   left join
      ( %select5a ) as t2
   on t1.jahr=t2.jahr AND t1.gnr=t2.gnr
   left join
      ( %select5b ) as t3
   on t1.jahr=t3.jahr AND t1.gnr=t3.gnr
%mend select6;

/* finally join tax units with tax force */
proc sql;
   create view
       fg_gji_steuerfuss_gb AS
   select
      t1.jahr,
      t1.gnr,
      t1.einwg,
      t2.stkabs
   from
      fg_gji_steinh as t1,
      ( %select6 ) as t2
   where
      t1.jahr=t2.jahr and t1.gnr=t2.gnr
   ;
quit;
0 голосов
/ 11 февраля 2020

Предлагаемое объединение (см. Ответ ниже от Тома, 6 февраля) работает нормально, если значения ключевых переменных (jahr, gnr) одинаковы для разных лет. Однако существует дополнительная проблема, заключающаяся в том, что несколько муниципалитетов могут объединиться в один муниципалитет в начале года. Это выражается в изменении номера сообщества (гнр). Оба сообщества, которые объединяются, получают одинаковый номер, то есть номер большего сообщества или даже новый номер. Значения последних известных данных (stkabs) должны быть скопированы в следующий год, перезаписав отсутствующие данные. Если два сообщества объединяются, данные должны быть добавлены. Возможно ли это express в виде?

...