SAS SQL中的Pivot转换,更简单?
我正在尝试在SAS proc SQL中进行pivot转换,并且已经获得了所需的数据集。 但是我正在寻找更简单的程序,没有重复的程序“max(case when NO=#then########end)”或者更好的方法。如果你有一个好的,请给我一些建议SAS SQL中的Pivot转换,更简单?,sql,sas,Sql,Sas,我正在尝试在SAS proc SQL中进行pivot转换,并且已经获得了所需的数据集。 但是我正在寻找更简单的程序,没有重复的程序“max(case when NO=#then########end)”或者更好的方法。如果你有一个好的,请给我一些建议 data test; input ID $ NO TIM $; cards; 1 1 8:31 1 2 8:32 1 3 8:33 1 4 8:34 2 1 8:35 2 2 8:36 2 3
data test;
input ID $ NO TIM $;
cards;
1 1 8:31
1 2 8:32
1 3 8:33
1 4 8:34
2 1 8:35
2 2 8:36
2 3 8:37
2 4 8:38
3 1 8:41
3 2 8:42
3 3 8:43
3 4 8:44
;
run;
proc sql;
create table test2 as
select ID,
max(case when NO = 1 then TIM end) as A1,
max(case when NO = 2 then TIM end) as B1,
max(case when NO = 3 then TIM end) as C1,
max(case when NO = 4 then TIM end) as D1
from test group by ID;
quit;
/*
test2 : I want this dataset
ID A1 B1 C1 D1
1 8:31 8:32 8:33 8:34
2 8:35 8:36 8:37 8:38
3 8:41 8:42 8:43 8:44
*/
看起来像一个简单的转置步骤。您可以使用ID语句告诉它使用一个或多个变量的值来构造变量名。可以使用PREFIX=选项为变量设置基名称。因此,这段代码将从示例数据中生成名为VAR1、VAR2、VAR3和VAR4的变量
proc transpose data=test out=want(drop=_name_) prefix=VAR ;
by id;
id no;
var tim;
run;
如果您希望变量的命名方式与您显示的方式相同,那么您需要构建某种方式,将1转换为“A1”,将2转换为“B1”,等等。例如,您可以定义一种将1映射为“A1”的格式
proc format ;
value abc 1='A1' 2='B1' 3='C1' 4='D1';
run;
proc transpose data=test out=want(drop=_name_);
by id;
id no;
var tim;
format no abc.;
run;
这看起来很简单。为什么不直接使用PROC转置呢?同意@Tom的说法。提供的SQL是坏的和危险的解决方案。@crow16384,为什么提供的SQL是坏的和危险的解决方案?@Parfait,SAS SQL是优秀和强大的,但问题的解决方案带来了一些不好的想法:1)没有默认的情况;2) 隐式将字符数据转换为具有最大危险性的数值,最好使用输入函数;3) 提供的SQL不是灵活(硬编码)的解决方案。PROC TRANSPOSE让您避免了所有这些问题,并使代码更加灵活。谢谢您的回答!这将非常有帮助。谢谢大家的宝贵意见和讨论。