首页 > 解决方案 > 多个日期之间的聚合

问题描述

我有这个数据集,其结构或多或少类似于以下内容:

产品 销售价值 销售数量 销售日期 第一期开始 第一期结束 第 2 阶段开始 第 2 阶段结束
XXX 6 2 2021-05-20 2021-05-15 2021-05-21 2021-05-22 2021-06-01
年年 10 3 2021-05-21 2021-05-15 2021-05-21 2021-05-22 2021-06-01
XXX 3 1 2021-05-23 2021-05-15 2021-05-21 2021-05-22 2021-06-01
XXX 6 2 2021-05-24 2021-05-15 2021-05-21 2021-05-22 2021-06-01

我想将“销售价值”和“销售数量”列相加,然后再创建 4 个列,分别称为“期间 1 销售额”、“期间 1 数量”、“期间 2 销售额”和“期间 2 数量”。

例如,使用上面的数据,我将获得四个新列,而行将按产品分组:

产品 第一期开始 第一期结束 第 2 阶段开始 第 2 阶段结束 第 1 期销售价值 第 1 期销售数量 第 2 期销售价值 第 2 期销售数量
XXX 2021-05-15 2021-05-21 2021-05-22 2021-06-01 6 2 9 3
年年 2021-05-15 2021-05-21 2021-05-22 2021-06-01 0 0 10 3

我正在使用 SQL Server,现在我几乎陷入困境。

到目前为止,我设法交叉加入我的日历表和销售表,以获得第一个矩阵中描述的表。

有人可以帮忙吗?

非常感谢!

标签: sqlsql-servertsqlbetween

解决方案


以下提供了您想要的结果,但您的 YYY 值除外,在您的示例数据中,值位于周期 1 而不是周期 2。

select Product,
    Period1start, Period1end, Period1start, Period2end,
    Sum(P1sales) Period1Sales, Sum(P1Qty) Period1Qty, 
    Sum(P2sales) Period2Sales, Sum(P2Qty) Period2Qty
from t
cross apply(values(case when SalesDate between Period1start and Period1end then SalesValue else 0 end)  )p1s(P1sales)
cross apply(values(case when SalesDate between Period1start and Period1end then SalesQty else 0 end)    )p1q(P1Qty)
cross apply(values(case when SalesDate between Period2start and Period2end then SalesValue else 0 end)  )p2s(P2sales)
cross apply(values(case when SalesDate between Period2start and Period2end then SalesQty else 0 end)    )p2q(P2Qty)
group by product, Period1start, Period1end, Period1start, Period2end

参见示例 DB<>Fiddle


推荐阅读