SAS Proc SQL --- как сделать функцию Листагг в SAS - PullRequest
0 голосов
/ 28 января 2019

Добрый день

Я ищу функцию listagg на SAS с использованием Proc SQL.

например

id         product_name
1001        Bananas
1002        Bananas
1002        Apples
1002        Peach
1003        Pears

proc sql;
create table work.test2 as
select id, _____(',', product_name)
from  test1
group by id
order by 1;
quit;

Результат

    id          product_name

    1001        Bananas
    1002        Bananas,Apples,Peach
    1003        Pears

В SAS есть такая функция?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вот пример двух подходов к такой проблеме:

  1. Это сделать в шаге данных и накапливать при прохождении
  2. Транспонировать данныев широком формате, а затем используйте функцию CAT.

    *create sample data for demonstration;
    data have;
        infile cards dlm='09'x;
        input OrgID Product $   States $;
        cards;
    1   football    DC
    1   football    VA
    1   football    MD
    2   football    CA
    3   football    NV
    3   football    CA
    ;
    run;
    
    *Sort - required for both options;
    proc sort data=have;
        by orgID;
    run;
    
    **********************************************************************;
    *Use RETAIN and BY group processing to combine the information;
    **********************************************************************;
    data want_option1;
        set have;
        by orgID;
        length combined $100.;
        retain combined;
    
        if first.orgID then
            combined=states;
        else
            combined=catx(', ', combined, states);
    
        if last.orgID then
            output;
    run;
    
    **********************************************************************;
    *Transpose it to a wide format and then combine into a single field;
    **********************************************************************;
    proc transpose data=have out=wide prefix=state_;
        by orgID;
        var states;
    run;
    
    data want_option2;
        set wide;
        length combined $100.;
        combined=catx(', ', of state_:);
    run;
    
0 голосов
/ 28 января 2019

вы можете сделать

data have;
input id product_name $;
datalines;
1001        Bananas
1002        Bananas
1002        Apples
1002        Peach
1003        Pears
 ;


  data want(rename=(product=product_name));
 do until(last.id);
 set have;
 by id;
 length product $50.;
  product =catx(',',product_name, product);
 end;
drop product_name;
run;
...