说我们有一些数据如下
{{1}}
问题是"找到我们拥有A类产品总销售额最高的36小时框架"使用 Excel 。
根据我的理解,如果我尝试接近它,36小时框架将意味着每个条目,我们将从那一点开始查看框架。例如,取第一个条目,从它开始的框架将是25/07/2016 03:21 - > 26/07/2016 15:21,1.5天后,意味着此帧的总和为12 + 15 + 3。采取任何措施的时间比考虑的条目更晚或更早将减少总和,不是吗?通过将每个条目作为起点,您的金额将跨越最远的条件。
对我来说,它看起来像SQL中的窗口总和。您如何仅使用Excel找到解决方案?
如果您也可以在SQL中提供解决方案,那就太好了。
谢谢。
答案 0 :(得分:1)
您需要提供有关36小时窗口如何工作的更多详细信息;它只是任意26小时的窗口,还是设置了定义的起点和终点的间隔?如果是后者,您只能使用额外的日期时间表来计算总和。
对于前者,您可以查看每次销售前后的36小时,然后查找这些值的最大值。最简单的方法是在Excel中使用Table
和以下SUMIFS
公式,这些公式会查找与日期时间值为36小时(1.5天)的行中相同类型的所有销售在给定行中的Datetime值之前或之后:
首先选择数据,然后选择插入表:
然后添加两列并输入以下公式:
上一页36小时:
= SUMIFS([销售],[类型],[@类型],[DATETIME], “&gt;” 中&安培; [@ DATETIME] -1.5 [DATETIME], “&LT =” &安培; [@ DATETIME])< / p>
接下来的36小时:
= SUMIFS([销售],[类型],[@类型],[DATETIME], “&LT;” &安培; [@ DATETIME] 1.5,[DATETIME], “&GT; =” &安培; [@ DATETIME])< / p>
要使用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)