楼主: 带发修行僧
1937 5

[问答] 用SQL语言求和 [推广有奖]

  • 0关注
  • 0粉丝

大专生

10%

还不是VIP/贵宾

-

威望
0
论坛币
859 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
294 点
帖子
25
精华
0
在线时间
52 小时
注册时间
2007-11-11
最后登录
2024-10-1

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
请教各位大神:

现在小弟想用sql语言求和:数据如下:

第一个数据是个panel data:

FirmDateShare

11111

01/01/1986

200

11111

02/01/1986

200

11111

03/01/1986

0

11111

04/01/1986

200

11111

05/01/1986

200

11111

08/01/1986

200

11111

09/01/1986

200

11111

10/01/1986

0

11111

11/01/1986

200

11111

12/01/1986

200

11111

15/01/1986

200

11111

16/01/1986

200

11111

17/01/1986

200

11111

18/01/1986

0

11111

19/01/1986

200

11111

22/01/1986

200

11111

23/01/1986

200

11111

24/01/1986

200

11111

25/01/1986

200

11111

26/01/1986

0

11111

29/01/1986

200

11111

30/01/1986

200

11111

31/01/1986

200

11112

01/01/1986

200

11112

02/01/1986

200

11112

03/01/1986

0

11112

04/01/1986

200

11112

05/01/1986

200

11112

08/01/1986

200

11112

09/01/1986

200

11112

10/01/1986

0

11112

11/01/1986

200

11112

12/01/1986

200

11112

15/01/1986

200

11112

16/01/1986

200

11112

17/01/1986

200

11112

18/01/1986

0

11112

19/01/1986

200

11112

22/01/1986

200

11112

23/01/1986

200

11112

24/01/1986

200

11112

25/01/1986

200

11112

26/01/1986

0

11112

29/01/1986

200

11112

30/01/1986

200

11112

31/01/1986

200



第二个数据是一个事件集:

FirmEvent StartEvent End

11111

03/01/1986

18/01/1986

11111

06/01/1986

25/01/1986

11112

09/01/1986

16/01/1986



现在想用sql语言求 (1)event_start前五天的share的和; (2). event_start开始以后五天的share的和; (3)event_end结束前五天的和; (4)event_end 结束后五天的和;(5)event_start 和 event_end 之间的和。

所有的求和都不包括event_start和event_end当天。

不胜感激!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:sql语言 sql panel data Event Start sql语言

沙发
取啥昵称叻 发表于 2014-10-4 09:34:38 |只看作者 |坛友微信交流群
进来看看                                                                        
                                       
                                                     
                                                     
                                             
                                                                 
                                                                                 

使用道具

藤椅
barry2000 发表于 2014-10-4 10:46:22 |只看作者 |坛友微信交流群
给个思路,先计算事件日和当天日期的差,然后根据条件创建新的数据集,再用sum 和group by 就可以得到你想要的数据

使用道具

板凳
yongyitian 发表于 2014-10-4 11:02:53 |只看作者 |坛友微信交流群
  1. data panel;
  2. input Firm Date ddmmyy10. Share;
  3.   format date yymmdd10.;
  4. datalines;
  5. 11111 01/01/1986 200
  6. 11111 02/01/1986 200
  7. 11111 03/01/1986 0
  8. 11111 04/01/1986 200
  9. 11111 05/01/1986 200
  10. 11111 08/01/1986 200
  11. 11111 09/01/1986 200
  12. 11111 10/01/1986 0
  13. 11111 11/01/1986 200
  14. 11111 12/01/1986 200
  15. 11111 15/01/1986 200
  16. 11111 16/01/1986 200
  17. 11111 17/01/1986 200
  18. 11111 18/01/1986 0
  19. 11111 19/01/1986 200
  20. 11111 22/01/1986 200
  21. 11111 23/01/1986 200
  22. 11111 24/01/1986 200
  23. 11111 25/01/1986 200
  24. 11111 26/01/1986 0
  25. 11111 29/01/1986 200
  26. 11111 30/01/1986 200
  27. 11111 31/01/1986 200
  28. 11112 01/01/1986 200
  29. 11112 02/01/1986 200
  30. 11112 03/01/1986 0
  31. 11112 04/01/1986 200
  32. 11112 05/01/1986 200
  33. 11112 08/01/1986 200
  34. 11112 09/01/1986 200
  35. 11112 10/01/1986 0
  36. 11112 11/01/1986 200
  37. 11112 12/01/1986 200
  38. 11112 15/01/1986 200
  39. 11112 16/01/1986 200
  40. 11112 17/01/1986 200
  41. 11112 18/01/1986 0
  42. 11112 19/01/1986 200
  43. 11112 22/01/1986 200
  44. 11112 23/01/1986 200
  45. 11112 24/01/1986 200
  46. 11112 25/01/1986 200
  47. 11112 26/01/1986 0
  48. 11112 29/01/1986 200
  49. 11112 30/01/1986 200
  50. 11112 31/01/1986 200
  51. ; run;

  52. data event;
  53. input Firm Event_Start :ddmmyy10. Event_End :ddmmyy10.;
  54.      format Event_start  Event_end yymmdd10.;
  55. datalines;
  56. 11111 03/01/1986 18/01/1986
  57. 11111 06/01/1986 25/01/1986
  58. 11112 09/01/1986 16/01/1986
  59. ; run;

  60. proc sql;
  61.     create table want as
  62.     select distinct  b.firm, b.event_start, b.event_end,
  63.           sum( case when 0 <  b.event_start - a.date <= 5  then share else . end) as sum_before_start,
  64.           sum( case when 0 >  b.event_start - a.date >= -5 then share else . end) as sum_after_start,
  65.           sum( case when 0 <  b.event_end   - a.date <= 5  then share else . end) as sum_before_end,
  66.           sum( case when 0 >  b.event_end   - a.date >= -5 then share else . end) as sum_after_end,
  67.           sum( case when  b.event_start < a.date < b.event_end then share else . end) as sum_between
  68.     from panel as a, event as b
  69.     where a.firm=b.firm
  70.     group by b.firm, b.event_start
  71.     order by b.firm, b.event_start;
  72. quit;
  73. proc print data=want; title 'want'; run;
复制代码

SQL_多条件求和.JPG (29.25 KB)

SQL_多条件求和.JPG

使用道具

报纸
yongyitian 发表于 2014-10-4 11:03:42 |只看作者 |坛友微信交流群
  1. data panel;
  2. input Firm Date ddmmyy10. Share;
  3.   format date yymmdd10.;
  4. datalines;
  5. 11111 01/01/1986 200
  6. 11111 02/01/1986 200
  7. 11111 03/01/1986 0
  8. 11111 04/01/1986 200
  9. 11111 05/01/1986 200
  10. 11111 08/01/1986 200
  11. 11111 09/01/1986 200
  12. 11111 10/01/1986 0
  13. 11111 11/01/1986 200
  14. 11111 12/01/1986 200
  15. 11111 15/01/1986 200
  16. 11111 16/01/1986 200
  17. 11111 17/01/1986 200
  18. 11111 18/01/1986 0
  19. 11111 19/01/1986 200
  20. 11111 22/01/1986 200
  21. 11111 23/01/1986 200
  22. 11111 24/01/1986 200
  23. 11111 25/01/1986 200
  24. 11111 26/01/1986 0
  25. 11111 29/01/1986 200
  26. 11111 30/01/1986 200
  27. 11111 31/01/1986 200
  28. 11112 01/01/1986 200
  29. 11112 02/01/1986 200
  30. 11112 03/01/1986 0
  31. 11112 04/01/1986 200
  32. 11112 05/01/1986 200
  33. 11112 08/01/1986 200
  34. 11112 09/01/1986 200
  35. 11112 10/01/1986 0
  36. 11112 11/01/1986 200
  37. 11112 12/01/1986 200
  38. 11112 15/01/1986 200
  39. 11112 16/01/1986 200
  40. 11112 17/01/1986 200
  41. 11112 18/01/1986 0
  42. 11112 19/01/1986 200
  43. 11112 22/01/1986 200
  44. 11112 23/01/1986 200
  45. 11112 24/01/1986 200
  46. 11112 25/01/1986 200
  47. 11112 26/01/1986 0
  48. 11112 29/01/1986 200
  49. 11112 30/01/1986 200
  50. 11112 31/01/1986 200
  51. ; run;

  52. data event;
  53. input Firm Event_Start :ddmmyy10. Event_End :ddmmyy10.;
  54.      format Event_start  Event_end yymmdd10.;
  55. datalines;
  56. 11111 03/01/1986 18/01/1986
  57. 11111 06/01/1986 25/01/1986
  58. 11112 09/01/1986 16/01/1986
  59. ; run;

  60. proc sql;
  61.     create table want as
  62.     select distinct  b.firm, b.event_start, b.event_end,
  63.           sum( case when 0 <  b.event_start - a.date <= 5  then share else . end) as sum_before_start,
  64.           sum( case when 0 >  b.event_start - a.date >= -5 then share else . end) as sum_after_start,
  65.           sum( case when 0 <  b.event_end   - a.date <= 5  then share else . end) as sum_before_end,
  66.           sum( case when 0 >  b.event_end   - a.date >= -5 then share else . end) as sum_after_end,
  67.           sum( case when  b.event_start < a.date < b.event_end then share else . end) as sum_between
  68.     from panel as a, event as b
  69.     where a.firm=b.firm
  70.     group by b.firm, b.event_start
  71.     order by b.firm, b.event_start;
  72. quit;
  73. proc print data=want; title 'want'; run;
复制代码
重复,请删贴
SQL_Multi_conditional_sum.JPG
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
带发修行僧 + 1 + 1 + 1 精彩帖子

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

使用道具

地板
带发修行僧 发表于 2014-10-7 15:51:03 |只看作者 |坛友微信交流群
yongyitian 发表于 2014-10-4 11:03
重复,请删贴
非常感谢!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-11-5 20:37