添加特定日期和第二天的所有值

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
;

【讨论】:

以上是关于添加特定日期和第二天的所有值的主要内容,如果未能解决你的问题,请参考以下文章

第二天:tomcat体系结构和第一个Servlet

Django TodayArchiveView 显示第二天的日期

10.16 (下午)开课一个月零十二天 (增删改查)

博客随笔第二天(多表查询)

SpringMVC第二天

第十二天——datetime模块