楼主: gqm2008
3049 8

[问答] {已解決}从一个表中读出多个数据,然后以每个数据为宏变量,调用一个宏程序 [推广有奖]

  • 2关注
  • 1粉丝

大专生

11%

还不是VIP/贵宾

-

威望
0
论坛币
7 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
165 点
帖子
41
精华
0
在线时间
33 小时
注册时间
2011-7-26
最后登录
2013-10-13

楼主
gqm2008 发表于 2012-3-25 17:07:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我现在有n个商品的 销售数据,我现在想把 每个商品 的销量和 价格 按时间序列做图,然后保存下来。

现有数据为 data sample, 我对其中的商品id做一个统计, 即用


data test;
set sample;
by ITEM_CODE1;
if first.ITEM_CODE1;
run;

得到表 test




test中有n个商品的ITEM_CODE1,然后让sas依次读取表中的商品ITEM_CODE1,然后执行宏 Marco plot,得出的图名称为此商品的 ITEM_CODE1,最后把结果保存在指定文件夹中。
感谢楼下 可~乐朋友的帮助,现修改代码如下,但是sas跑不出来,希望大家帮忙看看:



在sas中输入以下代码,






%Macro plot(itemcode);*此宏为做图,大家可略过,主要就是传递宏变量 &itemcode
data sample1;
set sample;
where ITEM_CODE1="&itemcode";
run;


data sampledate;
merge sample1 store048.date;
by date;
run;


proc sort data=sampledate;
by  ITEM_CODE1 date;
run;


data sample11;
set sampledate;
by ITEM_CODE1 date;
if first.date then daily_sales=0;
daily_sales+QTY;
if last.date then output;
run;


data sample11;
set sample11;
keep date daily_sales;
run;
proc sort data=sample11;
by date;
run;


data sampleprice;
merge sample1 store048.date;
by date;
retain netprice;
if not missing(price) then netprice=price;
run;


data sampleprice;
set sampleprice;
keep date netprice;
run;


data sampleprice;
set sampleprice;
by date;
if first.date;
run;


data mergesample;
merge sampleprice sample11;
by date;
run;


title "&itemcode";
proc gplot data=mergesample;
plot netprice*date;
plot2 daily_sales*date;
symbol1 i=join;
symbol2 i=needle;
run;


%mend;




proc sort data=sample out=test(keep=ITEM_CODE1) nodupkey;
        by ITEM_CODE1;
run;


%macro test;


%let dsid=%sysfunc(open(work.test,i));


%let rc=%sysfunc(fetch(&dsid));
        %do %while(&rc=0);
                %let itemcode=%sysfunc(trim(%sysfunc(left(%sysfunc(getvarc(&dsid,1))))));
                %plot(&itemcode);
                %let rc=%sysfunc(fetch(&dsid));     
        %end;
                %let rc=%sysfunc(close(&dsid));      

%mend;




简而言之,就是目前有数据集 sample,和表test, 利用宏将test中的
ITEM_CODE1 值赋予 &itemcode;
将 itemcode 从test中读出,然后执行 marco plot, 循环,最后得到所有的图。

数据表见附件 sas.rar (492.77 KB) 本附件包括:
  • sample.sas7bdat
  • test.sas7bdat











二维码

扫码加我 拉你入群

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

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

关键词:宏程序 NODUPKEY sysfunc missing Sample 文件夹 朋友 程序 统计

sas.rar
下载链接: https://bbs.pinggu.org/a-1074463.html

115.92 KB

请下载492kb的那个

本附件包括:

  • zuotu.sas
  • sample.sas7bdat

沙发
gqm2008 发表于 2012-3-25 17:30:28
自己顶一下,在线等

藤椅
gqm2008 发表于 2012-3-25 17:51:21
重新编辑了一下,求教大家了!

板凳
gqm2008 发表于 2012-3-25 19:01:56
求教高手啊!

报纸
gqm2008 发表于 2012-3-25 19:06:22
抱着热心求问的态度,请大家给点帮助,非常感谢!

地板
gqm2008 发表于 2012-3-25 20:05:24
求高人解答!

7
bobguy 发表于 2012-3-25 21:10:15
The sample program should have all ingredients needed for your problem. Good luck.


data t1;
    do prod='PROD1','PROD2','PROD3';
            do date=today( ) - 30 to today ( ) by 1;
                    n=ceil(ranuni(123)*10);
                        do i=1 to n;
                          
                          price= 10*ranuni(123)+5;
                          cost=  10*ranuni(123);
                          net_profit=price-cost;
                          itermnb+1;
              output;
                        end;
                end;
         end;
         drop n i;
         format date yymmdd10.;
run;

proc print;run;


%macro plotit(dsn=, prod=);

proc means data=&dsn nway;
class  date;
var net_profit ;
output out=stat mean=net_profit n=daily_sales;
where prod="&prod";
run;

goption reset=all;

symbol1 i=j line=1 value=star color=red;
symbol2 i=j line=2 value=dot color=green;

proc gplot data=stat;
plot net_profit*date;
plot2 daily_sales*date;
run;
quit;
%Mend plotit;

%plotit(dsn=t1, prod=PROD1);
%plotit(dsn=t1, prod=PROD2);
%plotit(dsn=t1, prod=PROD3);

8
可~乐 发表于 2012-3-26 00:14:12
恩,你试试运行看看下面程序
  1. %Marco plot(itemcode);
  2. data sample1;
  3. set sample;
  4. where ITEM_CODE1="&itemcode";
  5. run;

  6. data sampledate;
  7. merge sample1 store048.date;
  8. by date;
  9. run;

  10. proc sort data=sampledate;
  11. by  ITEM_CODE1 date;
  12. run;

  13. data sample11;
  14. set sampledate;
  15. by ITEM_CODE1 date;
  16. if first.date then daily_sales=0;
  17. daily_sales+QTY;
  18. if last.date then output;
  19. run;

  20. data sample11;
  21. set sample11;
  22. keep date daily_sales;
  23. run;
  24. proc sort data=sample11;
  25. by date;
  26. run;

  27. data sampleprice;
  28. merge sample1 store048.date;
  29. by date;
  30. retain netprice;
  31. if not missing(price) then netprice=price;
  32. run;

  33. data sampleprice;
  34. set sampleprice;
  35. keep date netprice;
  36. run;

  37. data sampleprice;
  38. set sampleprice;
  39. by date;
  40. if first.date;
  41. run;

  42. data mergesample;
  43. merge sampleprice sample11;
  44. by date;
  45. run;

  46. title 'STORE048 COFFEE NESTLE COFFEE MATE 200g';
  47. proc gplot data=mergesample;
  48. plot netprice*date;
  49. plot2 daily_sales*date;
  50. symbol1 i=join;
  51. symbol2 i=needle;
  52. run;

  53. %mend;


  54. proc sort data=sample out=test(keep=ITEM_CODE1) nodupkey;
  55.         by ITEM_CODE1;
  56. run;

  57. %macro test;
  58. *打开存放参数的数据集;
  59. %let dsid=%sysfunc(open(work.test,i));

  60. *fetch是为了判断是否读取完数据集记录,若已读完,则返回-1,否则返回0,赋给宏变量rc;
  61. %let rc=%sysfunc(fetch(&dsid));
  62.         %do %while(&rc=0);
  63.                 *trim是去掉字符右边的空格,left是去掉字符左边的空格,getvarc(&dsid,1)是读取数据集的第一列,
  64.                 读取第二列则为getvarc(&dsid,2),getvarc是针对字符,若该列是数值型的则为getvarn(&dsid,2);
  65.                 %let itemcode=%sysfunc(trim(%sysfunc(left(%sysfunc(getvarc(&dsid,1))))));
  66.                 %plot(&itemcode); *传参数到你所要调用的宏;
  67.                 %let rc=%sysfunc(fetch(&dsid));        *同上fetch;
  68.         %end;
  69.                 %let rc=%sysfunc(close(&dsid));        *关闭数据集;

  70. %mend;

  71. %test;
复制代码

9
gqm2008 发表于 2012-3-26 02:13:05
可~乐 发表于 2012-3-26 00:14
恩,你试试运行看看下面程序
我已经重新编辑原文,上传了两个附件,麻烦帮忙测试下,我这里尝试了下跑不出来;感谢

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 04:08