Excel运行总/窗口功能

时间:2016-08-01 08:26:16

标签: excel tsql window-functions running-total

说我们有一些数据如下

{{1}}

问题是"找到我们拥有A类产品总销售额最高的36小时框架"使用 Excel

根据我的理解,如果我尝试接近它,36小时框架将意味着每个条目,我们将从那一点开始查看框架。例如,取第一个条目,从它开始的框架将是25/07/2016 03:21 - > 26/07/2016 15:21,1.5天后,意味着此帧的总和为12 + 15 + 3。采取任何措施的时间比考虑的条目更晚或更早将减少总和,不是吗?通过将每个条目作为起点,您的金额将跨越最远的条件。

  1. 对我来说,它看起来像SQL中的窗口总和。您如何仅使用Excel找到解决方案?

  2. 如果您也可以在SQL中提供解决方案,那就太好了。

  3. 谢谢。

2 个答案:

答案 0 :(得分:1)

您需要提供有关36小时窗口如何工作的更多详细信息;它只是任意26小时的窗口,还是设置了定义的起点和终点的间隔?如果是后者,您只能使用额外的日期时间表来计算总和。

对于前者,您可以查看每次销售前后的36小时,然后查找这些值的最大值。最简单的方法是在Excel中使用Table和以下SUMIFS公式,这些公式会查找与日期时间值为36小时(1.5天)的行中相同类型的所有销售在给定行中的Datetime值之前或之后:

首先选择数据,然后选择插入表:

enter image description here

然后添加两列并输入以下公式:

上一页36小时:
= SUMIFS([销售],[类型],[@类型],[DATETIME], “&gt;” 中&安培; [@ DATETIME] -1.5 [DATETIME], “&LT =” &安培; [@ DATETIME])< / p>

接下来的36小时:
= SUMIFS([销售],[类型],[@类型],[DATETIME], “&LT;” &安培; [@ DATETIME] 1.5,[DATETIME], “&GT; =” &安培; [@ DATETIME])< / p>

enter image description here

要使用Datetime值中的36小时句点在SQL中执行此操作,您可以使用以下内容。我已经包括了之前和之后的36小时时段,因为只查看一个方向将错过数据集开头或结尾的销售。窗口函数不允许您指定数据驱动的窗口,因此您需要使用连接或子选择来实现您的目标:

declare @data table(dt Datetime, Type nvarchar(50), Sale int)
insert into @data
values
 ('2016/07/25 03:21','A',12)
,('2016/07/25 04:00','B',23)
,('2016/07/25 15:20','B',5)
,('2016/07/26 05:15','A',15)
,('2016/07/26 10:20','A',3)
,('2016/07/26 16:10','B',20)
,('2016/07/27 10:10','B',5)

select a.dt
        ,a.Type
        ,a.Sale
        ,sum(dprev.Sale) as PrevSales
        ,a.NextSales
from(
    -- If you only want the proceeding 36 hour period you can just use this part --
    select d.dt
            ,d.Type
            ,d.Sale
            ,sum(dnext.Sale) as NextSales
    from @data d
        left join @data dnext
            on(d.Type = dnext.Type
                and dnext.dt between d.dt and dateadd(hour,+36,d.dt)
                )
    group by d.dt
            ,d.Type
            ,d.Sale
    -------------------------------------------------------------------------------
) a
    left join @data dprev
        on(a.Type = dprev.Type
            and dprev.dt between dateadd(hour,-36,a.dt) and a.dt
            )
group by a.dt
        ,a.Type
        ,a.Sale
        ,a.NextSales
order by a.Type
        ,a.dt

答案 1 :(得分:1)

使用下面的公式在E2中写入 =SUMIFS($C$2:$C$8,$B$2:$B$8,"=A",$A$2:$A$8,">="&A2,$A$2:$A$8,"<"&A2+1.5)

enter image description here