Sql 计算SAS中的列累积和和百分比

Sql 计算SAS中的列累积和和百分比,sql,sas,Sql,Sas,我需要一些帮助以SAS proc SQL的形式创建查询 考虑以下数据集,其中来自不同地区的销售额已经减少了3小时,这只是数据集的一个子集,实际数据涵盖24小时: Date ObsAtHour Region Sales 1/1/2018 2 Asia 76 1/1/2018 2 Africa 5 1/1/2018 5 Asia 14 1/1/2018 5 Af

我需要一些帮助以SAS proc SQL的形式创建查询

考虑以下数据集,其中来自不同地区的销售额已经减少了3小时,这只是数据集的一个子集,实际数据涵盖24小时:

 Date        ObsAtHour Region   Sales
 1/1/2018    2         Asia     76 
 1/1/2018    2         Africa   5 
 1/1/2018    5         Asia     14
 1/1/2018    5         Africa   10
 2/1/2018    2         Asia     40
 2/1/2018    2         Africa   1 
 2/1/2018    5         Asia     15
 2/1/2018    5         Africa   20
我得到了过去45天的数据

我试着做两件事

1按日期、观察地点和地区分组,并获得累计销售额,这样我可以得到

 Date        ObsAtHour Region   Sales CumSales
 1/1/2018    2         Asia     76    76
 1/1/2018    2         Africa   5     5
 1/1/2018    5         Asia     14    90
 1/1/2018    5         Africa   10    15
 2/1/2018    2         Asia     40    40
 2/1/2018    2         Africa   1     1
 2/1/2018    5         Asia     15    55
 2/1/2018    5         Africa   20    21
2获取销售百分比,该百分比表明在任何观展活动中,每个地区的日销售额所占百分比。它看起来像:

 Date        ObsAtHour Region   Sales CumSales  Pct
 1/1/2018    2         Asia     76    76        84%
 1/1/2018    2         Africa   5     5         33%
 1/1/2018    5         Asia     14    90        100%
 1/1/2018    5         Africa   10    15        100%
 2/1/2018    2         Asia     40    40        72% 
 2/1/2018    2         Africa   1     1         4.76%
 2/1/2018    5         Asia     15    55        100%
 2/1/2018    5         Africa   20    21        100% 
非常感谢您的帮助。

如下图所示

data have;
input Date:mmddyy10.        ObsAtHour Region $  Sales;
format date mmddyy10;
datalines;
1/1/2018    2         Asia     76 
1/1/2018    2         Africa   5 
1/1/2018    5         Asia     14
1/1/2018    5         Africa   10
2/1/2018    2         Asia     40
2/1/2018    2         Africa   1 
2/1/2018    5         Asia     15
2/1/2018    5         Africa   20
 ;
 proc sort data=have;
 by date region;
 run;

/* this gives moving sum*/
 data have1;
format date mmddyy10.;
set have;
by   date region;
 if first.region then sumsales = sales;
  else sumsales+sales;
  run;

/* get the total sales from your intial table by group and join it back 
and calculate the percent*/
proc sql;
select a.*, sumsales/tot_sales  as per format =percent10.2 from 
(select * from have1)a
inner join
(select region , date, sum(sales) as tot_sales
from have
group by 1, 2)b
on a.region =b.region
 and a.date =b.date;

理解以下查询的关键是,累积级别将被称为层。层用作自联接条件的一部分,以限制分组以求和的项

资料

示例查询

第二个查询百分比计算是根据第一个查询累积计算的结果执行的,但是,第一个查询可以作为嵌套查询嵌入到第二个查询中

proc sql;
  create table want(label='Cumulative within day up to obsathour') as
  select 
    tiers.Date
  , tiers.ObsAtHour
  , tiers.Region
  , Sum(case when have.ObsAtHour = tiers.ObsAtHour then have.Sales else 0 end) as SalesAtTier
  , Sum(have.Sales) as CumSales
  , Count(*) as CumCount
  from
    have
  join
    (select distinct Date, ObsAtHour, Region from have) as tiers
  on
    have.Date = tiers.Date
    and have.Region = tiers.Region
    and have.ObsAtHour <= tiers.ObsAtHour
  group by
    tiers.Date, tiers.Region, tiers.ObsAtHour
  order 
    by Date, ObsAtHour, Region
  ;

  create table want2 as
  select
    cum.Date
  , cum.ObsAtHour
  , cum.Region
  , cum.SalesAtTier
  , cum.CumSales
  , cum.CumSales / Sum(cum.SalesAtTier) as fraction format=Percent7.2
  from
    want as cum
  group by
    cum.Date, cum.Region
  order by 
    cum.Date, cum.ObsAtHour, cum.Region
  ;
proc sql;
  create table want(label='Cumulative within day up to obsathour') as
  select 
    tiers.Date
  , tiers.ObsAtHour
  , tiers.Region
  , Sum(case when have.ObsAtHour = tiers.ObsAtHour then have.Sales else 0 end) as SalesAtTier
  , Sum(have.Sales) as CumSales
  , Count(*) as CumCount
  from
    have
  join
    (select distinct Date, ObsAtHour, Region from have) as tiers
  on
    have.Date = tiers.Date
    and have.Region = tiers.Region
    and have.ObsAtHour <= tiers.ObsAtHour
  group by
    tiers.Date, tiers.Region, tiers.ObsAtHour
  order 
    by Date, ObsAtHour, Region
  ;

  create table want2 as
  select
    cum.Date
  , cum.ObsAtHour
  , cum.Region
  , cum.SalesAtTier
  , cum.CumSales
  , cum.CumSales / Sum(cum.SalesAtTier) as fraction format=Percent7.2
  from
    want as cum
  group by
    cum.Date, cum.Region
  order by 
    cum.Date, cum.ObsAtHour, cum.Region
  ;