SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1923|回复: 11
打印 上一主题 下一主题

求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-8-3 10:45:55 | 只看该作者

求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

data a;
input ID$ Date yymmdd8. Num Act;
format Date yymmdd10.;
cards;
001 08-07-01 100 1
001 08-07-02 50  0
001 08-07-06 30  0
001 08-07-10 100  1
001 08-07-15 60  0
002 08-07-01 100 1
002 08-07-05 50 1
002 08-07-06 30 0
;
run;

数据中ID为商品编号,Date为采购或卖出时间,Num为采购或卖出数量,Act识别是采购还是卖出。

希望实现以下目标:按先采购(Act=1)先卖出(Act=0)的原则,求每次卖出商品(Act=0)的加权平均库存时间,这里很麻烦的一个问题是有些卖出对应着几个采购,比如第5行卖出的60中有20来自第一行的采购,另外40则来自第4行的采购。

第2行的库存时间为1天,第3行为5天,第5行为14×20/60+5×40/60,第8行库存时间为5天
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-8-3 22:04:29 | 只看该作者

Re: 求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

死猪头
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-8-4 14:40:35 | 只看该作者

Re: 求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

敬仰啊,谢谢~~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-8-5 12:00:00 | 只看该作者

Re: 求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

我喜欢单纯一点
[code:2r5gcp62]
data ahuige;
input ID$ Date yymmdd8. Num Act;
format Date yymmdd10.;
cards;
001 08-07-01 100 1
001 08-07-02 50 0
001 08-07-06 30 0
001 08-07-10 100 1
001 08-07-15 60 0
002 08-07-01 100 1
002 08-07-05 50 1
002 08-07-06 30 0
;
run;

data  buy(rename=(date=indate) drop=i num) sell(drop=i num);
    set ahuige;
    if act=1 then
        do i=1 to num;
        output buy;
        end;
    if act=0 then
        do i=1 to num;
        output sell;
        end;
run;

data temp;
    merge buy sell;
    by id;
    output;
    date=.;
run;

proc sql;
    create table final as
    select distinct id, date, act, avg(date-indate) as avgstore
    from temp( where=(act=0))
    group by id,date ;
[/code:2r5gcp62]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-8-5 13:19:23 | 只看该作者

Re: 求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

谢谢ahuige
你这个程序是比较简洁,不过如果数据很多的话(比如有100万以上的买记录和卖记录,每个记录的数量num又很大),产生的BUY和SELL会极其大吧,这个问题有没有办法克服掉呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-8-5 13:32:43 | 只看该作者

Re: 求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

很多情况下要代码简洁就有可能要有效率的代价。如果是有100万条等对运算效率的死要求,写法又会不一样了。
不过你的新问题有点含糊,
平均分到没卖完的每组,然后相当于是按各组买的日期分别来算?如果不能平均分怎么办?

现在忙,有时间以后再给你看。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-8-5 17:02:08 | 只看该作者

Re: 求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

DRAFT东西写了,但没时间QC,明天看看再发出来。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-8-5 18:01:54 | 只看该作者

Re: 求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

恩,多谢多谢,我等~~
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-8-6 09:40:02 | 只看该作者

Re: 求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

[code:2utn7j7u]data store sellandgift;
    infile datalines truncover;
    input ID$ Date yymmdd8. Num Act Note ;
    format Date yymmdd10.;
    if act=1 and note=. then output store;
    else  output sellandgift;
    datalines;
001 08-07-01 100 1 .
001 08-07-02 10 0 .
001 08-07-06 30 0 .
001 08-07-10 100 1 .
001 08-07-15 60 0 .
001 08-07-16 100 1 .
001 08-07-18 160 1 0
001 08-07-22 100 0 .
001 08-07-25 220 0 .
002 08-07-01 100 1 .
003 08-07-02 100 1 .
003 08-07-03 50 1 .
003 08-07-04 100 0 .
003 08-07-08 30 0 .
003 08-07-09 20 0 .
;
run;
%let offsetid=0;
%macro updateStore(num,note,id,selldate) ;
  %let offsetid=%eval(&offsetid+1);
  %if &note=. %then
    %do;
    data store(keep=id date num act note) avg(keep=id date num diff);
        set store ;
        by id date;
        retain number &num diff 0;
        if id=&id then
          do;
          offnum=min(num,number);
          num=num-offnum;
          number=number-offnum;
          diff=diff+(&selldate-date)*offnum;
          end;
        if num>0 then output store;
        if id=&id and last.id then do;diff=diff/#date=&selldate;output avg; end;
    run;

     proc append base=allavg
          data=avg;
     run;
    %end;
  %if &note=0 %then
    %do;
    proc sql;
      create table store(drop=oldnum ) as
      select *,oldnum+oldnum/sum(oldnum)*&num*(id="&id") as num
      from store(rename=(num=oldnum))
      group by id
      order by id,date;
    %end;
%mend;

data _null_;
  set sellandgift;
  length command $200;
  command=compress('%updateStore('||num||','||note||','||id||','||date||')');
  call execute(command);
run;[/code:2utn7j7u]
我把供应商送的货变成160了,不然都不够卖
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-8-6 20:37:26 | 只看该作者

Re: 求助:怎么将一行数据和多行数据进行匹配,然后生成新变量?

谢谢!
你这个是求的每次卖出的平均库存时间,我现在想求的是每次进货的平均库存时间,对着你的程序改了半天,也没成,感觉小改达不到目标,看来学习SAS路还长啊 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->  <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->  <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-6 02:56 , Processed in 0.071125 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表