【发布时间】:2021-10-30 20:11:15
【问题描述】:
我正在处理类似于以下的数据,
week | product | sale
1 | ABC | 2
1 | ABC | 1
2 | ABC | 1
3 | ABC | 5
4 | ABC | 1
2 | DEF | 5
假设这是我的 Orders 表,名为 tblOrders。现在,在每一行中,我想汇总该产品上周的总销售额 - 例如,如果我在产品“ABC”的第 2 周,我需要显示产品 ABC 第 1 周的总销售额。因此,输出应如下所示,
week | product | sale | ProductPreviousWeekSales
1 | ABC | 2 | 0
1 | ABC | 1 | 0
2 | ABC | 1 | 3
3 | ABC | 5 | 1
4 | ABC | 1 | 5
2 | DEF | 5 | 0
我最初认为我可以使用聚合和窗口函数来解决这个问题,但看起来并非如此。我的另一个想法是使用条件聚合 - 类似于 sum(case when x=currentRow.x then sale else 0 end),但这也行不通。
这是上述示例的 SQLFiddle - http://sqlfiddle.com/#!18/890b7/2
注意:我需要计算过去 4 周的相似值,因此尽量避免将其作为子查询或多个连接(如果可能)执行,因为我正在使用的数据集非常大,并且不想在尝试合并此更改时增加太多性能开销。
【问题讨论】:
-
您确定要在结果中保留 1|ABC 的两行吗?难道您不想在累积销售中排一排吗?如果您想在结果中保留多行和产品,并且我将 3|DEF|1 和 3|DEF|2 添加到您的数据中,那么我想这两个都将显示前一周的销售量 5?
-
@ThorstenKettner 是的,我需要保留 1|ABC 的两条记录。您是对的,如果添加 3|DEF|1 和 3|DEF|2,则两者都应该将上周的总销售额显示为 5。
-
@TimBiegeleisen 完成。图像现在替换为文本。
-
正如 Thorson 所说,如果您想要该产品在该周的总销售额,那么您的输出没有意义,那么您的前 2 个结果将是与销售额 3 的一行。否则这没有意义。您也许可以使用 LAG 窗口函数来获取前几周的销售额
标签: sql sql-server sql-server-2019