BookmarkSubscribeRSS Feed
RxJunior
Fluorite | Level 6

Pessoal, Bom dia!

 

Estou tentando concatenar as linhas de uma variável de meu dataset, semelhante ao uso do STRING_AGG no SQL.

 

EX:

| variável |

|Valor 1   |

|Valor 2   |

|Valor 3   |

|Valor x   |

 

Para

 

|           Nova Variavel                 | 

|Valor 1, Valor 2, Valor 3, Valor x|

 

 

 

6 REPLIES 6
Wanderico_Icatu
Fluorite | Level 6

@RxJunior, bom dia.

 

Veja se é isso que vc precisa:

 


data tabela1;
format NOME $60.;
infile datalines delimiter=',';
input NOME;
datalines;
MARIA
JÚLIA
JOÃO
MARCOS
;
run;

 

data concat;
set tabela1;

format concatenacao $char100.;

retain concatenacao;

concatenacao = compress(nome) || ", " || concatenacao;
run;

 

Wanderico_Icatu_0-1655215110944.png

 

RxJunior
Fluorite | Level 6

 

Não é essa solução que procuro.

 

Para Exemplificar melhor... o que eu preciso é ...

 

Cliente   | Data_Compra |

Jose       | 01/02/2022     |

Jose       | 01/03/2022     |

Jose       | 01/04/2022     |

Jose       | 01/05/2022     |

 

 

para...

Cliente   |                              Data_Compras                             |

Jose       | 01/02/2022 , 01/03/2022, 01/04/2022,  01/05/2022  |

Wanderico_Icatu
Fluorite | Level 6

@RxJunior, a ideia seria essa mesma, porém com algumas adatações que fiz agora que detalhou melhor o problema.

 

Segue a solução:

 


data tabela1;
format CLIENTE $60. DATA_COMPRAS $10.;
infile datalines delimiter=',';
input CLIENTE DATA_COMPRAS;
datalines;
JOSE,01/02/2022
MARIA,02/02/2022
JOSE,01/03/2022
MARIA,02/03/2022
JOSE,01/04/2022
MARIA,02/04/2022
JOSE,01/05/2022
MARIA,02/05/2022
;
run;

proc sort data= tabela1; by CLIENTE; run;


data concat;
set tabela1;

format DATA_COMPRAS_CONCAT $char100.;

retain DATA_COMPRAS_CONCAT;

if first.CLIENTE then DATA_COMPRAS_CONCAT = '';

by CLIENTE;

DATA_COMPRAS_CONCAT = compress(DATA_COMPRAS) || ", " || DATA_COMPRAS_CONCAT;

if last.CLIENTE;

drop DATA_COMPRAS;
run;

 

Wanderico_Icatu_0-1655219682672.png

 

RFARIAS
Calcite | Level 5

Oi tudo bem?
Se importa de me tirar uma dúvida? Nessa resposta que vc deu, ficou um triângulo conforme foi concatenando, sendo a ultima linha, a mais completa. Que alterações eu deveria fazer para que esse valor da ultima linha subisse para as demais?

 

exemplo:

em vez de 

jesus            jesus

maria           jesus maria

josé             jesus maria josé

 

gostaria de 

jesus             jesus maria josé

maria            jesus maria josé

josé              jesus maria josé

pauloMoreira
Fluorite | Level 6
Boa tarde RxJunior,

Tente a função Catx.

Exemplo: variável=catx(', ', 'Valor 1', 'Valor 2', 'Valor 3', 'Valor x');
gilmarcezar
Calcite | Level 5

Boa tarde RxJunior, 

tive um desafio parecido e criei uma macro que faz quase isso.
Você pode alterar para atender sua necessidade.

 

%macro tab_group_concat(tabSAS, tabSaida, coluna);

proc sql;
select name into :col separated by ' '
from dictionary.columns
where libname = "WORK"
AND memname= "&tabSAS" and name<>"&coluna";

select name into :colf separated by ', '
from dictionary.columns
where libname = "WORK"
AND memname= "&tabSAS" and name<> "&coluna" ;

select catx(' ', "&coluna") into :colvar
from dictionary.columns
where libname = "WORK"
AND memname= "&tabSAS" and name<> "&coluna";
quit;

proc sql;
create table ordenado_temp as
select * from &tabSAS order by &colf;
quit;

%put &col;
%put &colf;
%put &colvar;

%let col = &col;
%let colf = &colf;
%let colvar = &colvar;

proc transpose data=ordenado_temp out=temp_mcr name=tipo prefix=col;
by &col;
var &colvar;
run;
data temp_mcr1;

set work.temp_mcr;
if tipo = "&colvar" then
do;
new_var = CATX(", ", OF col:);
end;
run;

proc sql;
CREATE TABLE &tabSaida as
select t1.*
from (select distinct &colf, new_var as &coluna from temp_mcr1
group by &colf) as t1
where t1.&coluna <> '';
quit;


%mend tab_group_concat;
data test;
Cliente='Jose'; Data_Compra='01/02/2022';output;
Cliente='Jose'; Data_Compra='01/03/2022';output;
Cliente='Jose'; Data_Compra='01/04/2022';output;
Cliente='Jose'; Data_Compra='01/05/2022';output;
run;
%tab_group_concat(TEST, TESTE, Data_Compra);

SAS Innovate 2025: Register Now

Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!

Discussion stats
  • 6 replies
  • 2223 views
  • 3 likes
  • 5 in conversation