楼主: ertyuj
3031 8

用SAS编个小程序,看看是谁经常光顾这家小店 [推广有奖]

  • 0关注
  • 1粉丝

已卖:7份资源

硕士生

40%

还不是VIP/贵宾

-

威望
0
论坛币
254 个
通用积分
0.7615
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
-351 点
帖子
136
精华
0
在线时间
164 小时
注册时间
2007-2-7
最后登录
2022-3-17

楼主
ertyuj 发表于 2014-12-15 04:53:00 |AI写论文
50论坛币
我有这样一个顾客名单,它有谁哪天光顾了这家小店。请大侠帮我写段macro程序,按照姓名和电话号码,生成在X天的区间内逛店次数是Y的顾客名单,比如;

在2014/01/01-2014/01/05这个5天的区间内逛店次数是2的顾客名单,以及每个人的各次订单价值;
在2014/01/02-2014/01/06这个5天的区间内逛店次数是2的顾客名单,以及每个人的各次订单价值;
等等。

数据举例如下:


DATA visit_history;
   INPUT  name $ 1-4 phone @11 visit_date date11. @22 order ;
CARDS;
John 1234 12 Jan 2014 120
John 1234 15 Jan 2014 100
John 5000 12 Nov 2014 200
Mark 7896 18 Jun 2014 500
;
RUN;
PROC PRINT DATA=visit_history;
format visit_date  date11.;
RUN;

变量说明:

name姓名;
phone 电话号码
visit_date逛店日期
order订单价值

注意,数据中的第2个人和第3个人的名字一样但是电话不同,虽然同名,但这是两个人而非同一个人。

如果以上描述不清楚的话,请尽可按照你的理解来写程序,对于任何具有参考价值的程序,我都答谢。


最佳答案

jl60156 查看完整内容

%macro test(num=, inds=, outds=, date_start=, date_end=); proc sql noprint; create table &outds(drop=visitnum namephone) as select count(namephone) as visitnum, namephone, name, phone, visit_date, order from (select catx(" ",name,phone) as namephone, name, phone, visit_date, order from &inds having ("&date_start"d
关键词:小程序 History format Visit Story 程序 小店 2014 电话 价值
数据科学和机器学习博客:https://shorturl.at/jtHTW

沙发
jl60156 发表于 2014-12-15 04:53:01
%macro test(num=, inds=, outds=, date_start=, date_end=);
proc sql noprint;
        create table &outds(drop=visitnum namephone) as
        select count(namephone) as visitnum, namephone, name, phone, visit_date, order
        from (select catx(" ",name,phone) as namephone, name, phone, visit_date, order from &inds
                having ("&date_start"d <= visit_date <= "&date_end"d))
        group by  namephone
        having  visitnum=&num
        order by  namephone;       
quit;

%if not &sqlrc and &sqlobs=0 %then
        %put NO NAME SATIFYS CONDITION: &num visits between &date_start and &date_end;

%mend test;

%test(num=1, inds=visit_history, outds=want,  date_start=12JAN2014, date_end=15JAN2014)

藤椅
zxn2011 发表于 2014-12-15 08:07:12
proc sort data=visit_history;
by name;
run;
data visitor;
set visit_history;
count+1;
by name;
if first.name then count=1;
if last.name then output;
run;

板凳
zxn2011 发表于 2014-12-15 08:11:42
dddddddddddd

报纸
jl60156 发表于 2014-12-15 08:17:11
%macro test(num=, inds=, outds=, date_start=, date_end=);
proc sql noprint;
        create table &outds(drop=visitnum) as
        select count(name) as visitnum, name, phone, visit_date, order
        from (select name, phone, visit_date, order from &inds
                having ("&date_start"d <= visit_date <= "&date_end"d))
        group by name
        having calculated visitnum=&num and visit_date
        order by name;       
quit;

%if not &sqlrc and &sqlobs=0 %then
        %put NO NAME SATIFYS CONDITION: &num visits between &date_start and &date_end;

%mend test;

%test(num=3, inds=visit_history, outds=want,  date_start=12JAN2014, date_end=15JAN2014)

地板
ertyuj 发表于 2014-12-15 10:52:56
jl60156 发表于 2014-12-15 08:17
%macro test(num=, inds=, outds=, date_start=, date_end=);
proc sql noprint;
        create table &outds( ...
多谢回复,很详细的一段代码。注意,数据中的第2个人和第3个人的名字一样但是电话不同,虽然同名,但这是两个人而非同一个人。 请问能再修改一下你的这段程序吗?

现在我能想到的是,我可先根据名字和电话创建一个新的名字变量然后应用你的代码。不知还有其他解决方法没有。

7
ertyuj 发表于 2014-12-16 07:37:23
jl60156 发表于 2014-12-15 04:53
%macro test(num=, inds=, outds=, date_start=, date_end=);
proc sql noprint;
        create table &outds( ...
在这个subquery中是不是应该用where而不是having呢?(见下)

having ("&date_start"d <= visit_date <= "&date_end"d))

能不能给科普一下,having和where的用法选择呢?是不是说,只要能用where的地方就能用having,但是如有summary function,例如count,就只能用having?

多谢科普!

8
jl60156 发表于 2014-12-16 10:47:36
  

Differences between the HAVING  Clause and WHERE Clause

  
  

HAVING clause attributes

  
  

WHERE clause attributes

  
  

is typically used to specify conditions for including  or excluding groups of rows from a table.

  
  

is used to specify conditions for including or  excluding individual rows from a table.

  
  

must follow the GROUP BY clause in a query, if used  with a GROUP BY clause.

  
  

must precede the GROUP BY clause in a query, if used  with a GROUP BY clause.

  
  

is affected by a GROUP BY clause; when there is no  GROUP BY clause, the HAVING clause is treated like a WHERE clause.

  
  

is not affected by a GROUP BY clause.

  
  

is processed after the GROUP BY clause and any  aggregate functions.

  
  

is processed before a GROUP BY clause, if there is one,  and before any aggregate functions.

  


Taken from SAS user guide

9
ertyuj 发表于 2014-12-16 10:58:22
jl60156 发表于 2014-12-16 10:47
Taken from SAS user guide
遇到大侠了啊!失敬失敬

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

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