楼主: lizhewenbei
3682 8

我想把若干个数据库进行合并(求并集而非交集),怎么如下程序只能求交集呢? [推广有奖]

  • 15关注
  • 2粉丝

副教授

14%

还不是VIP/贵宾

-

威望
0
论坛币
221 个
学术水平
4 点
热心指数
13 点
信用等级
5 点
经验
9479 点
帖子
587
精华
0
在线时间
367 小时
注册时间
2008-2-6
最后登录
2018-5-20

lizhewenbei 学生认证  发表于 2014-7-14 10:48:46 |显示全部楼层
/*合并所有数据库,放在work逻辑库中*/
proc sql;
create table control as
select distinct
a.stkcd, a.accper,a.accperyy,
b.pay_top3,
c.shrcr1,c.shrcr3,
d.zongshizhi,
e.ind,  e.ind_2code,  e.baohu,  e.polution,
f.zichan,   f.fuzhai,
h.tobinq_a,  h.tobinq_b,  h.tobinq_c,  h.tobinq_d,  h.bm_1,  h.bm_2,
i.inc_oper,
j.zhouqi_a,  j.zhouqi_b,  j.zhouqi_c, j.gudongquanyizhouqi_a,  j.gudongquanyizhouqi_b,  j.gudongquanyizhouqi_c,
k.ocf,  k.fcf,

from
cont.earning a,            cont.gaoguanxinchou b,      cont.guquanjizhong c,
cont.shizhi d,             cont.indcd_new  e,          cont.lev_size f,
cont.listdt    g,           cont.tobinq     h,         cont.inc_oper i,
cont.zhouqi    j,          cont.fcf         k

where a.stkcd =b.stkcd =c.stkcd =d.stkcd=e.stkcd=f.stkcd=g.stkcd=h.stkcd  =i.stkcd  =j.stkcd =k.stkcd
and   a.accper=b.reptdt=c.reptdt                =f.accper       =h.accper =i.accper =j.accper=k.year
and   a.accperyy=d.year

order by stkcd;
quit;


stata SPSS
bluebluestar 发表于 2014-7-14 13:03:17 |显示全部楼层
where 只能求交集,并集是 union(排除重复)
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
lizhewenbei + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

回复

使用道具 举报

920240553 发表于 2014-7-14 14:28:57 |显示全部楼层
本帖最后由 920240553 于 2014-7-15 16:30 编辑

你再试试这个:
  1. proc sql;
  2.         create table control as
  3.         select distinct
  4.         a.stkcd, a.accper,a.accperyy,
  5.         b.pay_top3,
  6.         c.shrcr1,c.shrcr3,
  7.         d.zongshizhi,
  8.         e.ind,  e.ind_2code,  e.baohu,  e.polution,
  9.         f.zichan,   f.fuzhai,
  10.         h.tobinq_a,  h.tobinq_b,  h.tobinq_c,  h.tobinq_d,  h.bm_1,  h.bm_2,
  11.         i.inc_oper,
  12.         j.zhouqi_a,  j.zhouqi_b,  j.zhouqi_c, j.gudongquanyizhouqi_a,  j.gudongquanyizhouqi_b,  j.gudongquanyizhouqi_c,
  13.         k.ocf,  k.fcf,

  14.         from
  15.         cont.earning as a
  16.         left join
  17.         cont.gaoguanxinchou as b
  18.                 on a.stkcd =b.stkcd and a.accper = b.reptdt
  19.         left join
  20.         cont.guquanjizhong as c
  21.                 on a.stkcd = c.stkcd and a.accper = c.reptdt
  22.         left join
  23.         cont.shizhi as d
  24.                 on a.stkcd = d.stkcd and a.accperyy = d.year
  25.         left join
  26.         cont.indcd_new as e
  27.                 on a.stkcd = e.stkcd
  28.         left join
  29.         cont.lev_size as f
  30.                 on a.stkcd = f.stkcd and a.accper = f.accper
  31.         left join
  32.         cont.listdt  as  g
  33.                 on a.stkcd = g.stkcd
  34.         left join
  35.         cont.tobinq as  h
  36.                 on a.stkcd = h.stkcd and a.accper = h.accper
  37.         left join
  38.         cont.inc_oper as i
  39.                 on a.stkcd = i.stkcd and a.accper = i.accper
  40.         left join
  41.         cont.zhouqi as j
  42.                 on a.stkcd = j.stkcd and a.accper = j.accper
  43.         left join
  44.         cont.fcf  as k
  45.                 on a.stkcd = k.stkcd and a.accper = k.year

  46.         order by a.stkcd;
  47. quit;
复制代码
因为没有你的数据集,为了让你更清楚地理解,现简单举例如下:
  1. /*创建三个数据集*/
  2. data a;
  3.         input id name $ sex $ height weight;
  4.         cards;
  5.         1 zhangsan 男 175 75
  6.         2 lisi 女 160        50
  7.         3 wanger 女 165 55
  8.         ;
  9. data b;
  10.         input id name $ age;
  11.         cards;
  12.         1 xizong 55
  13.         2 likeq 54
  14.         3 wenjiab 63
  15.         ;
  16. data c;
  17.         input id name1 $ name2 $ relship ~&$20.;
  18.         cards;
  19.         1 zhang1 zhang2 "dad and son"
  20.         2 wang zhang2 "mum and son"
  21.         3 zhang1 wang "husband and wife"
  22.         ;
  23. run;

  24. /*将三个数据库合并求并集*/
  25. /*方法一:data step*/
  26. %macro sort(dataset = ,key =);
  27. %let i = 1;
  28.         proc sort data = &dataset. nodupkey;
  29.                 by &key.;
  30.         run;
  31. %mend;
  32. %sort(dataset = a,key = id);
  33. %sort(dataset = b,key = id);
  34. %sort(dataset = c,key = id);
  35. /*横向合并*/
  36. data d1;
  37.         merge a b c;
  38.         by id;
  39. run;
  40. /*纵向合并*/
  41. data d2;
  42.         set a b c;
  43. run;


  44. /*sql方法*/
  45. /*横向合并*/
  46. proc sql noprint;
  47.         create table d3 as
  48.         select * from a
  49.         left join b
  50.         on a.id = b.id
  51.         left join c
  52.         on a.id = c.id
  53.         order by a.id;
  54. quit;
复制代码

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
lizhewenbei + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

回复

使用道具 举报

璐然然 发表于 2014-7-14 15:02:19 来自手机 |显示全部楼层
使用sas enterprise guide 吧,里面可以outer join
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
lizhewenbei + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

回复

使用道具 举报

lizhewenbei 学生认证  发表于 2014-7-14 17:48:40 |显示全部楼层
920240553 发表于 2014-7-14 14:28
/*合并所有数据库,放在work逻辑库中*/
proc sql;
        create table control as
您好!我试了试,但是log报错了,不知怎么回事。

282  /*合并控制变量数据库,放在work逻辑库中*/
283  proc sql;
284  create table control as
285  select distinct
286  a.stkcd, a.accper,a.accperyy,
287  b.pay_top3,
288  c.shrcr1,c.shrcr3,
289  d.zongshizhi,
290  e.ind,  e.ind_2code,  e.baohu,  e.polution,
291  f.zichan,   f.fuzhai,
292  h.tobinq_a,  h.tobinq_b,  h.tobinq_c,  h.tobinq_d,  h.bm_1,  h.bm_2,
293  i.inc_oper,
294  j.zhouqi_a,  j.zhouqi_b,  j.zhouqi_c, j.gudongquanyizhouqi_a,  j.gudongquanyizhouqi_b,  j.gudongquanyizhouqi_c,
295  k.ocf,  k.fcf,
296  l.central_soe,  l.local_soe,  l.soe
297  from
298          cont.earning as a
299          union all
300          cont.gaoguanxinchou as b
             ----
             79
301          union all
             -----
             22
             76
ERROR 79-322: 期望“SELECT”。

ERROR 22-322: 语法错误,期望下列之一: 带引号的字符串, ',', AS, FORMAT, FROM, INFORMAT, INTO, LABEL, LEN, LENGTH, TRANSCODE.

ERROR 76-322: 语法错误,语句将被忽略。

302          cont.guquanjizhong as c
303          union all
304          cont.shizhi as d
305          union all
306          cont.indcd_new as e
307          union all
308          cont.lev_size as f
309          union all
310          cont.listdt  as  g
311          union all
312          cont.tobinq as  h
313          union all
314          cont.inc_oper as i
315          union all
316          cont.zhouqi as j
317          union all
318          cont.fcf  as k
319          union all
320          cont.attri_ctrl  as l
321  on a.stkcd =b.stkcd =c.stkcd =d.stkcd=e.stkcd=f.stkcd=g.stkcd=h.stkcd  =i.stkcd  =j.stkcd =k.stkcd=l.stkcd
322  and   a.accper=b.reptdt=c.reptdt                =f.accper       =h.accper =i.accper =j.accper
323  and   a.accperyy=d.year=k.year=l.year
324  order by stkcd;
325  quit;
NOTE: 由于出错,SAS 系统停止处理该步。
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.03 秒
      CPU 时间          0.03 秒
回复

使用道具 举报

lizhewenbei 学生认证  发表于 2014-7-14 17:54:10 |显示全部楼层
本帖最后由 lizhewenbei 于 2014-7-14 17:57 编辑

/*老师上课时举得例子说,如果两个数据库求并集,做外部链接,可以这么做*/
proc sql;
create table m20 as
select m12.donate,ret1.stock,ret1.year,ret1.ret
from m12 full join ret1
on m12.stock=ret1.stock and m12.year=ret1.year;
quit;
但是如果是多个数据库做外部链接,是不是就要把“from m12 full join ret1”变成“from m12
union all ret1
union all ret2
union all ret3


?
回复

使用道具 举报

lizhewenbei 学生认证  发表于 2014-7-14 18:22:30 |显示全部楼层
换成这种样子也不行/*合并控制变量数据库,放在work逻辑库中*/
proc sql;
create table control as
select distinct a.stkcd, a.accper,a.accperyy from  cont.earning as a
union all
select distinct b.pay_top3 from  cont.gaoguanxinchou as b
union all
select distinctc.shrcr1,c.shrcr3 from  cont.guquanjizhong as c
on a.stkcd =b.stkcd =c.stkcd and   a.accper=b.reptdt=c.reptdt
order by stkcd;
quit;
回复

使用道具 举报

920240553 发表于 2014-7-15 16:32:15 |显示全部楼层
已修改,请看三楼编辑过的帖子。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
lizhewenbei + 1 + 1 + 1 非常有水平!

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

回复

使用道具 举报

lizhewenbei 学生认证  发表于 2014-7-17 13:29:05 |显示全部楼层
发现论坛的朋友很棒
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 我要注册

GMT+8, 2018-5-20 17:55