如何根据时间过滤器按两组计算行数?

时间:2019-01-17 21:28:38

标签: sas

我试图根据每个客户的交易时间来计算我的产品销售量。为了说明这一点,客户拥有三种类型的产品,例如计算机,打印机和键盘,如果此项目未标记为1,我想放一个计数器来显示过去12个月的销售订单(如果标记为1,我也有一个标记是否与广告系列一起出售)。这是我的数据的样子;

ID  PRODUCT   SALETIME CAMPAIGN_FLAG
100 Keyboard    201705             0
100 printer     201708             1
100 computer    201801             0
100 keyboard    201806             0
200 printer     201801             1
200 keyboard    201805             0 
200 computer    201808             0

我想得到什么;

ID  PRODUCT  SALETIME CAMPAIGN_FLAG COUNT
100 Keyboard   201705             0     1
100 printer    201708             1     1
100 computer   201801             0     2
100 keyboard   201806             0     2
200 printer    201801             1     0
200 keyboard   201805             0     1
200 computer   201808             0     2

我尝试了很多事情,例如左连接表与同一表,而仅销售具有campaing = 0标志(我仅在右侧带了SALETIME列)。然后尝试在销售时间的前一年添加一列,并在销售时间在一年之前和现在之间放置一个标记Count_sum。然后我将Count_sum的总和按ID,产品,SALETIME分组。这实际上是可行的,但是如果客户在同一个月内有两种产品,我将无法处理,在这种情况下,我将失去柜台。例如:

ID  PRODUCT  SALETIME CAMPAIGN_FLAG COUNT
100 Keyboard   201705             0     1
100 printer    201708             1     1
100 computer   201801             0     3
100 keyboard   201801             0     3
200 printer    201801             1     0
200 keyboard   201805             0     2
200 computer   201805             0     2

我不知道如何解决此问题。如果您能提供帮助,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

实际上,您将按SALETIME和ID分组,例如

SELECT *, COUNT(*) AS COUNT FROM TABLE GROUP BY ID, SALETIME ORDER BY ID

但是,结果不会完全相同,因为我无法仅通过查看您的数据来得出标准;-)

答案 1 :(得分:0)

如果我对您的了解很好,那么您所寻找的只是您要为特定产品的第一个实例编号的每个ID。

请不要在数据线中或数据中使用键盘和键盘,如果您使用相同格式的数据,并且需要将其设置为单个值(如键盘或键盘两者都不是),则会导致问题

首先创建数据集

  data have;
 input ID  PRODUCT $   SALETIME CAMPAIGN_FLAG;
 datalines;
100 keyboard    201705             0
100 printer     201708             1
100 computer    201801             0
100 keyboard    201806             0
200 printer     201801             1
200 keyboard    201805             0 
200 computer    201808             0
;

然后按ID和产品对数据进行排序,这是为了在后续步骤中使用逻辑,这样您就不必在相同的ID中再次计算相同的产品。

 proc sort data=have out=have1 ;
 by id  product;
 run;


   data have2;
    set have1 ;
   by id product;
  if first.product then num = 0;
  else num=1;
  run;

/ *,然后使用id和saletime * /

将其按原样归还数据
proc sort data=have2 out=have3;
 by id SALETIME;
   run;

最终应用逻辑

 data want(drop =num);
  set have3;
  by id;
  if first.id then count=0;
  if CAMPAIGN_FLAG = 0 and num = 0
   then count+1;
  run;

proc打印数据=想;     运行;

enter image description here