楼主: akalius
2606 13

请教一个多多合并问题 [推广有奖]

  • 10关注
  • 3粉丝

已卖:155份资源

讲师

50%

还不是VIP/贵宾

-

威望
0
论坛币
3999 个
通用积分
2.8543
学术水平
4 点
热心指数
6 点
信用等级
6 点
经验
7835 点
帖子
262
精华
0
在线时间
613 小时
注册时间
2009-7-22
最后登录
2025-3-18

楼主
akalius 学生认证  发表于 2017-3-24 11:27:18 |AI写论文
100论坛币
把辅助数据集中的月份加到主数据集,主数据集所有变量取值不变保留

主数据集
comayearqtrcombvarm
阿里

2014

1

顺丰

1

阿里

2014

1

圆通

1.2

阿里

2014

2

圆通

2

阿里

2014

3

圆通

3

阿里

2015

1

圆通

4

阿里

2015

2

中通

5

京东

2014

1

顺丰

6

京东

2014

2

顺丰

7

京东

2014

3

顺丰

8

京东

2014

4

申通

9

京东

2015

1

申通

10




辅助

combyearqtrmonthvaravarb
顺丰

2013

4

12

1

2

顺丰

2014

1

1

2

3

顺丰

2014

1

2

3

4

顺丰

2014

1

3

4

5

顺丰

2014

2

4

5

6

顺丰

2014

2

5

6

7

顺丰

2014

2

6

7

8

顺丰

2014

3

7

8

9

顺丰

2014

3

8

9

10

顺丰

2014

3

9

10

11

顺丰

2014

4

10

11

12

顺丰

2014

4

11

12

13

顺丰

2014

4

12

13

14

圆通

2014

1

1

14

15

圆通

2014

1

2

15

16

圆通

2014

1

3

16

17

圆通

2014

2

4

17

18

圆通

2014

2

5

18

19

圆通

2014

2

6

19

20

圆通

2014

3

7

20

21

圆通

2014

3

8

21

22

圆通

2014

3

9

22

23

圆通

2014

4

10

23

24

圆通

2014

4

11

24

25

圆通

2014

4

12

25

26

圆通

2015

1

1

26

27

圆通

2015

1

2

27

28

圆通

2015

1

3

28

29




想得到类似

comayearqtrcombvarmmonthvaravarb
阿里

2014

1

顺丰

1

1

2

3

阿里

2014

1

顺丰

1

2

3

4

阿里

2014

1

顺丰

1

3

4

5

阿里

2014

1

圆通

1.2

1

14

15

阿里

2014

1

圆通

1.2

2

15

16

阿里

2014

1

圆通

1.2

3

16

17

阿里

2014

2

圆通

2

4

17

18

阿里

2014

2

圆通

2

5

18

19

阿里

2014

2

圆通

2

6

19

20


最佳答案

sonypam 查看完整内容

其实只是最后输出OutTable数据集中重新整理好顺序,你可以试试在SQL中把排序语句去掉看看结果。
关键词:month year BVAR Vara mont

沙发
sonypam 在职认证  发表于 2017-3-24 11:27:19 来自手机
akalius 发表于 2017-3-26 16:21
为什么一定要用index1 and index2 呢    在排序中感觉没有体现什么作用
其实只是最后输出OutTable数据集中重新整理好顺序,你可以试试在SQL中把排序语句去掉看看结果。

藤椅
sq2008 发表于 2017-3-24 11:44:09
有点难,期待高手解决!!

板凳
进击的小瓶盖 发表于 2017-3-24 13:16:06
对两个数据及关于comb year qtr排序,data c;merge a(in=a) b(in=b);by comb year qtr;run;类似的,具体细节自己调试一下应该差不多吧。。。不过不方便从操作所以也不是很确定

报纸
zwnSAS121 发表于 2017-3-24 13:58:39
  1. data main;
  2. input coma$        year qtr comb$ varm;
  3. cards;
  4. 阿里         2014 1 顺丰 1
  5. 阿里         2014 1 圆通 1.2
  6. 阿里         2014 2 圆通 2
  7. 阿里         2014 3 圆通 3
  8. 阿里         2015 1 圆通 4
  9. 阿里         2015 2 中通 5
  10. 京东         2014 1 顺丰 6
  11. 京东         2014 2 顺丰 7
  12. 京东         2014 3 顺丰 8
  13. 京东         2014 4 申通 9
  14. 京东         2015 1 申通 10
  15. ;
  16. run;

  17. data auxi;
  18. input comb$        year month qtr vara varb;
  19. datalines;
  20. 顺丰         2013 4 12 1 2
  21. 顺丰         2014 1 1 2 3
  22. 顺丰         2014 1 2 3 4
  23. 顺丰         2014 1 3 4 5
  24. 顺丰         2014 2 4 5 6
  25. 顺丰         2014 2 5 6 7
  26. 顺丰         2014 2 6 7 8
  27. 顺丰         2014 3 7 8 9
  28. 顺丰         2014 3 8 9 10
  29. 顺丰         2014 3 9 10 11
  30. 顺丰         2014 4 10 11 12
  31. 顺丰         2014 4 11 12 13
  32. 顺丰         2014 4 12 13 14
  33. 圆通         2014 1 1 14 15
  34. 圆通         2014 1 2 15 16
  35. 圆通         2014 1 3 16 17
  36. 圆通         2014 2 4 17 18
  37. 圆通         2014 2 5 18 19
  38. 圆通         2014 2 6 19 20
  39. 圆通         2014 3 7 20 21
  40. 圆通         2014 3 8 21 22
  41. 圆通         2014 3 9 22 23
  42. 圆通         2014 4 10 23 24
  43. 圆通         2014 4 11 24 25
  44. 圆通         2014 4 12 25 26
  45. 圆通         2015 1 1 26 27
  46. 圆通         2015 1 2 27 28
  47. 圆通         2015 1 3 28 29
  48. ;

  49. proc sql noprint;
  50. create table wanted as
  51. select
  52. b.month,
  53. a.*
  54. from main as a,
  55.      auxi as b
  56. where a.comb=b.comb
  57. and   a.year=b.year
  58. and   a.qtr=b.qtr
  59. ;
  60. quit;
复制代码

地板
akalius 学生认证  发表于 2017-3-24 19:56:11
zwnSAS121 发表于 2017-3-24 13:58
ERROR: 用“等于 (=)”的表达式具有不同数据类型的组件。

7
wang1839 在职认证  发表于 2017-3-24 22:27:15
楼上数据类型搞错了 comb设成字符型,YEAR和QTR设成数值型即可

8
wang1839 在职认证  发表于 2017-3-24 22:28:10
进击的小瓶盖 发表于 2017-3-24 13:16
对两个数据及关于comb year qtr排序,data c;merge a(in=a) b(in=b);by comb year qtr;run;类似的, ...
多对多不能MERGE

9
akalius 学生认证  发表于 2017-3-25 10:00:15
wang1839 发表于 2017-3-24 22:27
楼上数据类型搞错了 comb设成字符型,YEAR和QTR设成数值型即可
调整了  结果不对   还是不行    我觉得这个好像没用sql      我还是用个宏循环一下吧

10
sonypam 在职认证  发表于 2017-3-26 11:27:15
Multiple to multiple merge cannot be done using SAS data step (actually it can be done, but the result will be unexpected), so normally, when dealing with multiple to multiple merge, we will use sql, please see the detailed code in below:

data main;
        input coma$ year qtr comb$ varm;
        index1 = _N_; /*Used for ordering data in OutTable*/
cards;
阿里         2014 1 顺丰 1
阿里         2014 1 圆通 1.2
阿里         2014 2 圆通 2
阿里         2014 3 圆通 3
阿里         2015 1 圆通 4
阿里         2015 2 中通 5
京东         2014 1 顺丰 6
京东         2014 2 顺丰 7
京东         2014 3 顺丰 8
京东         2014 4 申通 9
京东         2015 1 申通 10
;
run;

data auxi;
        input comb$ year qtr month vara varb;
        index2 = _N_; /*Used for ordering data in OutTable*/
datalines;
顺丰         2013 4 12 1 2
顺丰         2014 1 1 2 3
顺丰         2014 1 2 3 4
顺丰         2014 1 3 4 5
顺丰         2014 2 4 5 6
顺丰         2014 2 5 6 7
顺丰         2014 2 6 7 8
顺丰         2014 3 7 8 9
顺丰         2014 3 8 9 10
顺丰         2014 3 9 10 11
顺丰         2014 4 10 11 12
顺丰         2014 4 11 12 13
顺丰         2014 4 12 13 14
圆通         2014 1 1 14 15
圆通         2014 1 2 15 16
圆通         2014 1 3 16 17
圆通         2014 2 4 17 18
圆通         2014 2 5 18 19
圆通         2014 2 6 19 20
圆通         2014 3 7 20 21
圆通         2014 3 8 21 22
圆通         2014 3 9 22 23
圆通         2014 4 10 23 24
圆通         2014 4 11 24 25
圆通         2014 4 12 25 26
圆通         2015 1 1 26 27
圆通         2015 1 2 27 28
圆通         2015 1 3 28 29
;
run;

proc sql;
        create table OutTable(drop=index1) as
        select main.*, auxi.vara, auxi.varb
        from main, auxi
        where main.comb = auxi.comb and main.year = auxi.year and main.qtr = auxi.qtr
        order by main.index1, auxi.index2;
quit;

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-25 14:29