SAS SQL:如何将不同列的值堆叠到一列中?

时间:2013-11-27 14:04:57

标签: sql sas

我的数据是,

id    date1    date1_flag    date2    date2_flag    date3    date3_flag
001   20020212      1         
032   20061130      1
020                          20060603      2
040   20041023      1
094                          20090110      2
044                                                 20040320       3

..并且有超过200,000个条目

我想拥有,

id    date       date_flag
001   20020212      1    
032   20061130      1
020   20060603      2
040   20041023      1
094   20090110      2
044   20040320      3

基本上我想把所有日期变成一列,所有date_flags变成一列。

每个id只有一个日期(例如,id不能有date1和date2)。 我认为一开始会很容易,但我无法理解它。

3 个答案:

答案 0 :(得分:0)

使用这样的合并函数:

proc sql;
create table NewTable as
select coalesce(date1, date2, date3) as date
, coalesce(date1_flag, date2_flag, date3_flag) as date_flag
from YourTable;
quit;

Coalesce将使用它找到的第一个值。因此,如果您确定每行只有一个日期/标记,那么这将起到作用。

答案 1 :(得分:0)

有很多解决方案......

您可以在数据步骤中使用数组函数执行此操作。你可以像Oliver建议的那样使用coalesce来做。您也可以使用UNION执行此操作:

proc sql;
    select id, date1 as date, 1 as date_flag
    from YourTable
    where date1~=.

    union all
    select id, date2 as date, 2 as date_flag
    from YourTable
    where date2~=.

    union all
    select id, date3 as date, 3 as date_flag
    from YourTable
    where date3~=.
quit;

或者,最后,你可以使用SQL case语句来做,但这可能是不必要的复杂,所以我不会进入它。

答案 2 :(得分:0)

正如其他人已经注意到有多种方法可以做到这一点。您可能希望在proc sql中执行此操作,但我只是在使用条件语句的数据步骤循环中执行此操作。

data work.Temp (rename = (date1 = date date1_flag = date_flag));
    input id date1 date1_flag date2 date2_flag date3 date3_flag;
    if date2 NE . then date1 = date2;
    if date3 NE . then date1 = date3;
    if date2_flag NE . then date1_flag = date2_flag;
    if date3_flag NE . then date1_flag = date3_flag;
    drop date2 date2_flag date3 date3_flag;

    datalines;
    001   20020212      1 . . . . 
    032   20061130      1 . . . .  
    020       .          .         20060603      2 . . 
    040   20041023      1 . . . .  
    094         .         .        20090110      2  . . 
    044         .         .            .          .         20040320       3 
    ;

run;

proc print data=work.temp; run;

句号.表示数据值为空/缺失。