我在一家公司的销售部门工作,每个月我们都有一些销售收入为负的产品。我的工作是提取那些产品ID来分析它们。我使用的是使用SAS语言的WPS。因此,我首先需要使用proc sql提取产品ID(例如,在96年2月的产品中)。 在第二步中,我在proc sql中使用这些ID来获取有关这些产品的额外信息,如价格,日期等......
问题在于,在WPS中,有一个限制是3000次观察,而不是在proc sql语句中读取。 所以我需要做一个循环,计算一个月内ID的数量,然后提取它附加的3000个第一个ID的信息,并附加以下ID,并一次又一次地追加,直到我得到所有9680个ID,并带有额外信息
我的代码是:
PROC SQL;
CREATE TABLE Febsales.NB_IDs AS
SELECT /* COUNT of Number of products */
(COUNT(t1.ID)) AS NB_ID
FROM ID_prod t1
WHERE t1.ID_sales_revenue < 0;
QUIT;
其余的我不知道该怎么做。
我的想法是告诉sas:
do i=1 to='&NB_ID' by=3000
然后使用以下代码进行提取:
%TeradataOpen (Lib= Revenue AF Socle ODS,dataout=af0215_liste1)
SELECT
OD_prod.pd_ID,
OD_prod.pd_line ,
OD_prod.pd_serie ,
OD_prod.pd_manu,
OD_prod.pd_cust_ID,
OD_prod.pd_price,
OD_prod.pd_amount,
OD_prod.pd_cost,
OD_prod.pd_buyer,
OD_prod.pd_mkt_share,
OD_prod.pd_gross,
OD_prod.pd_marketor,
sum(OD_prod.pd_mkt_share) as tot_share,
sum(OD_prod.pd_GROss) as tot_rev,
OD_prod.DAT_prod as prod,
FROM
OD_prod,
OD_ manufact
WHERE .....
然后是:
proc append
答案 0 :(得分:0)
您可以使用以下内容
Num
是源数据集中的观察总数,您在第一步中执行此操作Chunk
是您想要一次读取的观察次数,3000
在你的情况下。下面的代码片段执行以下操作:
starting
(如1,3001,6001等)和ending
(3000,6000,9000等)记录位置 %let num=10000;
%let chunk=3000;
data _NULL_;
length startp $200. endp $200.;
Numofloop=int(&num./&chunk.);
if _N_=1 then do; startp=1; endp=&chunk.; end;
do i=1 to Numofloop-1;
sp=i*&chunk + 1;
ep=(i+1)*&chunk.;
if i=Numofloop-1 then ep=&num.;
startp=catx(",",startp,sp);
endp=catx(",",endp,ep);
put _ALL_;
output;
call symput("startp",startp);
call symput("endp",endp);
call symput("loop",Numofloop);
end;
run;
在使用loop
和starting
以及ending positions
的此步骤中,temp
数据集中的每一步都会读取3000条记录,并且正在{ {1}}数据集。
alldata
这可能不是您问题的确切解决方案,但当然您可以使用此
构建代码答案 1 :(得分:0)
%LET LIMIT = 3000 ; /* Get list of IDs */ proc sql ; create table idlist as select distinct ID from id_prod where ID_SALES_REVENUE < 0 order by ID ; quit ; /* Assign GROUP number to each set of &LIMIT ID's */ data idlist2 ; set idlist ; N = _n_ ; GROUP = floor(N / &LIMIT) + 1; run ; /* Get number of groups */ proc sql ; select max(GROUP) into :GRP_CNT from idlist2 ; quit ; %MACRO BUILD_VIEWS ; /* Build view1-view<n> for each group of &LIMIT ID's */ proc sql ; %DO G = 1 %TO &GRP_CNT ; create view pd_view&G as select ... from od_prod, od_manufact where ... and pd_id in(select ID from idlist2 where GROUP = &G) ; %END ; quit ; %MEND ; %BUILD_VIEWS ; /* Now read from each view into 1 dataset */ data master ; set pd_view1-pd_view&GRP_CNT ; run ;