我试图过滤一些记录并根据几个字段进行聚合。我知道汇总函数不能用在where子句中。任何人都可以通过一个小技巧来帮助我获得我想要的结果。
请在下面找到更多详情。
orderno orderdate billdate经销商sku sof diff demandqty / n
1 18.6.14 18.6.14 113999 11131280 8001 0 100 /n
5 18.6.14 18.6.14 113999 11131280 8001 0 50 /n
5 18.6.14 19.6.14 113999 11131280 8001 1 50 /n
7 18.6.14 19.6.14 113999 11131280 8001 1 60 /n
7 18.6.14 20.6.14 113999 11131280 8001 2 60 /n
8 18.6.14 19.6.14 113999 11131280 8001 1 75 /n
8 18.6.14 20.6.14 113999 11131280 8001 2 75 /n
这里针对特定的订单日期,sof,sku组合,我想得到总需求数量,只考虑相应的第一条记录。
例如,
日期:18/6/2014 SKU 11131280 SOF 8001
所需的需求(100+50+60+75=285)
,其中差异为(0,0,1,1)
,对于订单1,5,7,8
而言,差异最小。
答案 0 :(得分:0)
如果我理解正确,您应该对by date,sof,sku,dif
进行排序,然后使用相同的键再次排序,但使用nodupkey选项(或执行datstep by date,sof,sku
和if first.sku
)然后求和使用proc means
。
答案 1 :(得分:0)
我首先对数据集进行排序,然后使用数据步骤来计算总需求(使用FIRST。自动变量来仅选择第一个订单号)。我在源数据中添加了一些额外的行,以便完全测试代码。
data have;
input orderno orderdate :ddmmyy8. billdate :ddmmyy8. dealer sku sof diff demandqty;
format orderdate billdate date9.;
datalines;
1 18.6.14 18.6.14 113999 11131280 8001 0 100
5 18.6.14 18.6.14 113999 11131280 8001 0 50
5 18.6.14 19.6.14 113999 11131280 8001 1 50
7 18.6.14 19.6.14 113999 11131280 8001 1 60
7 18.6.14 20.6.14 113999 11131280 8001 2 60
8 18.6.14 19.6.14 113999 11131280 8001 1 75
8 18.6.14 20.6.14 113999 11131280 8001 2 75
1 18.6.14 18.6.14 114000 11131290 8002 0 10
5 18.6.14 18.6.14 114000 11131290 8002 0 20
1 19.6.14 18.6.14 114000 11131290 8002 0 70
5 19.6.14 18.6.14 114000 11131290 8002 0 80
;
run;
proc sort data=have;
by orderdate sof sku orderno;
run;
data want (keep=orderdate sof sku tot_demand);
set have;
by orderdate sof sku orderno;
if first.sku then tot_demand=0;
if first.orderno then tot_demand+demandqty;
if last.sku then output;
run;