【发布时间】:2020-11-17 06:38:57
【问题描述】:
我正在尝试在 SAS proc SQL 中进行数据透视转换,并且我已经获得了所需的数据集。 但我正在寻找更简单的程序,没有重复的程序“max(case when NO = # then ### end) as ##”,或者更好的方法。如果你有好的,请给我一些建议。
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
*/
【问题讨论】:
-
这对我来说看起来很简单。
-
为什么不直接使用 PROC TRANSPOSE?
-
同意@Tom。前提是 SQL 是糟糕且危险的解决方案。
-
@crow16384,为什么向 SQL 提供一个糟糕而危险的解决方案?
-
@Parfait,SAS SQL 非常出色且功能强大,但问题的解决方案带有一些不好的想法:1)没有默认值的情况; 2) 隐式将字符数据转换为带最大值的数字 - 危险,更好地使用输入函数; 3) 提供的 SQL 不是灵活(硬编码)的解决方案。 PROC TRANSPOSE 让您避免所有此类问题并使代码灵活。