添加特定日期和第二天的所有值
Posted
技术标签:
【中文标题】添加特定日期和第二天的所有值【英文标题】:Adding all values for certain dates and the following day 【发布时间】:2018-12-03 22:23:51 【问题描述】:我正在尝试做一些报告,以查看活动是否在活动后的第二天也推动了销售。因此,为此,我尝试为每组数据添加活动当天和活动后第二天的所有销售额。就本报告而言,销售发生在哪家商店并不重要。但是,一天最多可以出现 22 次(每个商店 1 次)。所有数据都存储在一个名为 UCS 的表中。
我已经尝试找到一种方法来使用案例语句和临时表使 Lag 或 Lead 工作,但到目前为止没有运气。
下面是几个屏幕截图,以帮助显示我正在尝试做的事情。我需要为每个屏幕截图添加标记为黄色的销售额。
您会注意到,在示例 2 中,我没有添加 11/4 或 11/13 的值。虽然这些是数据集中的下一个日期,但它们不是日历上的第二天。
示例1
示例 2
【问题讨论】:
对于未来的问题,请不要使用数据图像,因为它们不可重复使用。如果您只是粘贴格式化的表格,例如ozh.github.io/ascii-tables(为什么?想象一下,如果答案是查询图像) 谢谢我不知道如何处理格式化表格。 【参考方案1】:发布此消息后的片刻,我的大脑点击并想通了。我可以使用仅包含日历日期的日期表来制作一个临时表,其中包含一个日期列表,其中有一个事件与一个日期列表进行联合,该日期列表等于事件 +1 的日期。然后使用它来加入并限制原始表。下面的示例代码可以更好地解释。
If OBJECT_ID('tempdb.dbo.#Event') IS NOT NULL DROP TABLE #Event
Select *
Into #Event
From (
Select
Universal_ID
,Date
From UCS
Where Month = 11
and Year = 2018
and Event = 1
Union
Select
Universal_ID
,DL.Date
From UCS
Join DateLookup as DL
on DATEADD(d,1,UCS.Date) = DL.Date
Where UCS.Month = 11
and UCS.Year = 2018
and Event = 1
) as A
Select
Sum(Sale) as Sale
From UCS
Join #Event as E
on UCS.Universal_ID = E.Universal_ID
and UCS.date = E.date
Where Month = 11
and Year = 2018
【讨论】:
【参考方案2】:您实际上并不需要一个通用的日期集,如果日期不在 UCS 表中,则对最终结果无关紧要
select
sum(sale)
from UCS t
inner join (
select date from UCS where event = 1
union
select dateadd(day,1,date) from UCS where event = 1
) d on t.date = d.date
您可以避免子查询中的联合,这可能有助于通过使用交叉连接避免通过 UCS 表,但这可能不值得 - 只有评估执行计划才能揭示这一点:
select
sum(sale)
from UCS t
inner join (
select distinct dateadd(day,cj.n,date) as date
from UCS
cross join (select 0 as n union all select 1) cj
where event = 1
) d on t.date = d.date
;
【讨论】:
以上是关于添加特定日期和第二天的所有值的主要内容,如果未能解决你的问题,请参考以下文章