SAS为宏的每个值重复一组语句

时间:2018-07-18 17:53:39

标签: sas

我说过Teradata中的两个表,其中之一-报告就是这样

Year    Report_ID   BAD_PART_NUMBERS
2015    P12568  6989820
2015    P12568  1769819
2015    P12568  1988700
2015    P12697  879010
2015    P12697  287932
2015    P12697  17902

和其他表格订单

order_no    Customer_id Purchase dt PART_NUM    PART_DESC
265187  B1792   3/4/2016    02-6989820  gfsahj
1669    B1792   7/8/2017    01-32769237 susisd
1692191 B1794   5/7/2015    03-6989820  gfsahj
16891   B1794   3/24/2016   78-1769819  ysatua
62919   B1794   2/7/2017    15-3287629  at8a9s7d

我的目标之一是为每个Report_ID查找在购买不良零件后最常购买的零件号 对于一个report_ID,我编写了如下代码:

 %let REPORT_ID=('P12568');
 Proc SQL;
 connect to teradata as tera1 (server='XXX' user=&userid pwd=&pwd Database 
 ="XXXXX" );
create table BAD_PART as
select * from connection to tera1
(
 select REPORT_ID,BAD_PART_NUMBERS from REPORTS where REPORT_ID=&REPORT_ID 
 *other where conditions
 group by 1,2
 )
;
disconnect from tera1;
quit;
/*creating a PART_NUM macro*/
PROC SQL NOPRINT;
SELECT quote(cats('%',BAD_PART_NUMBERS),"'")  
INTO :PART_NUM separated by ", "
FROM BAD_PART ;
QUIT;

%put macro variable PART_NUM:&PART_NUM;

/*FINDING SECONDARY PART INFORMATION*/
proc sql;
 connect to teradata as tera1 (server='XXXX' user=&userid pwd=&pwd Database 
 =" XXXX" );
create table SEC_PART as
select * from connection to tera1
(
SELECT  &REPORT_ID as REPORT_ID, PART_NUM, PART_DESC,COUNT (DISTINCT ORDER) 
as frequency
       from (
select  Customer_id,Min(Purchase_dt)  as FIRST_BAD_PART_PURCHASE
from    ORDERS  
where       (PART_NUM like any(&PART_NUM)) A
left join (
select  Customer_id, Purchase_dt, PART_NUM, PART_DESC,ORDER
from    ORDERS group by 1,2,3,4,5 ) B 
                        on A. Customer_id =B. Customer_id
    AND FIRST_BAD_PART_PURCHASE< Purchase_dt 
group by 1,2,3 order by frequency desc
having frequency>0
)
;
disconnect from tera1;
quit;

/*---various PROC SQL and Data steps*/

最终,我有一个数据集

 Report_ID  MONTHS  VALUE
 P12568     0       21
 P12568     1       34
 P12568     2       40.38
 P12568     3       67.05
 P12568     4       100.08

这里连续几个月,这是暴露月份。对于每个report_id,都需要附加最终表。假设我有兴趣查看一年内的所有report_id,例如;

select REPORT_ID from reports where year='2015'. 

现在,我的代码正在处理一个Report_ID,但是如果我有兴趣一次查找多个。

1 个答案:

答案 0 :(得分:0)

尝试在Teradata中执行整个查询。代替构造任何列表,加入bad_part查询并使用串联构造类似模式。

深入查询中尝试使用

JOIN ( select part_num bad_part_num from <bad part_num query> ) bad_list ON 
PART_NUM like '%' || bad_list.bad_part_num

代替

where       (PART_NUM like any(&PART_NUM)) A

其中任何列表是通过SAS Proc SQL(into :)宏构造的%开头的不良零件编号的列表。