你能帮我解决这个问题吗?我为您缩短了示例,所以可以说我有这张表:
data MyTable;
input Household age gender $ flag;
datalines;
1 45 male married
1 35 female married
2 50 female married
2 52 male married
3 32 male child
3 50 male married
3 60 female married
;
run;
我有已婚夫妇和家庭中的其他人,我需要将丈夫的价值观加入到妻子中,并将妻子的价值观加入到丈夫中以获得此输出:
data MyTable2;
input Household age gender $ flag $ age_partner;
datalines;
1 45 male married 35
1 35 female married 45
2 50 female married 52
2 52 male married 50
3 32 male child
3 50 male married 60
3 60 female married 50
;
run;
这就是我尝试过的代码,但是,是的,这不起作用,它只执行语句的 t2 部分。
proc sql;
create table MyTable2 as
select t1.\*, t2.age as age_partner, t3.age as age_partner
from MyTable as t1
left join (select household, age from MyTable where gender = 'male' & flag = 'married') as t2
on t1.household=t2.household & t1.gender = 'female' & t1.flag = 'married'
left join (select household, age from MyTable where gender = 'female' & flag = 'married') as t3
on t1.household=t3.household & t1.gender = 'male' & t1.flag = 'married';
quit;
如果我将这两个连接分开,那么从逻辑上讲,最后一个自连接会重写前一个连接,并且在输出中只有丈夫会有妻子的年龄,而妻子不会有丈夫的年龄。
当然,我可以在单独的列中进行操作,然后在第三列中进行所需的输出。
但是你知道一些解决方案可以在一个 proc sql 代码中完成它吗?
提前非常感谢!
假设你的逻辑成立(我怀疑由于各种数据质量原因这不会成立)。
proc sql;
create table want as
select t1.*, case when t1.flag='married' then t2.age else . end as age_partner
from mytable as t1
left join (select * from mytable where flag='married') as t2
on t1.household=t2.household and t1.gender ne t2.gender;
quit;