【问题标题】:Excel running total / window functionExcel运行总计/窗口函数
【发布时间】:2016-08-01 08:26:16
【问题描述】:

假设我们有一些数据如下

Datetime             Type  Sale
25/07/2016 03:21      A     12
25/07/2016 04:00      B     23
25/07/2016 15:20      B     5
26/07/2016 05:15      A     15
26/07/2016 10:20      A     3
26/07/2016 16:10      B     20
27/07/2016 10:10      B     5

.......

问题是使用 Excel 来“找出我们拥有最大 A 类产品总销售额的 36 小时框架”。

据我了解,如果我尝试接近它,36 小时框架将意味着每个条目,我们将从那时起查看框架。例如,取第一个条目,以它开头的帧将是 25/07/2016 03:21 -> 26/07/2016 15:21,1.5 天后,这意味着该帧的总和是 12+15+3 .比所考虑的条目晚或早取任何东西会减少总和,不是吗?通过将每个条目作为起点,您的总和“跨越最远”。

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

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

谢谢。

【问题讨论】:

  • 你能粘贴预期的输出吗..对于 Excel 运行总计,请查看support.office.com/en-us/article/…
  • 我没有原始输入也没有输出。这是一道测试题。独立于实际输入的方法是什么?

标签: excel tsql window-functions cumulative-sum


【解决方案1】:

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

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

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

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

前 36 小时:
=SUMIFS([Sale],[Type],[@Type],[Datetime],">"&[@Datetime]-1.5,[Datetime],"

接下来的 36 小时:
=SUMIFS([Sale],[Type],[@Type],[Datetime],"="&[@Datetime])

要在 SQL 中使用 Datetime 值的 36 小时周期执行此操作,您可以使用以下命令。我已经包括了之前和之后的 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

【讨论】:

  • 这是我想的问题的一个重点。请参阅我更新的问题。如果你定义一个任意的 36 小时,你将不会有一个最优的总和。 36 小时应该从每个条目开始“跨越最远”。
  • @Kenny 编辑答案以反映 36 小时期间的定义。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-09
    • 2023-03-30
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多