过去N周(包括销售为0的一周)的SQL销售总额
我想显示每周4周销售额的总和当前一周加上前3周的每个项目 原始数据 预期的结果项a作为示例 我试着用 按项目订单按周划分的销售总额第3行 然而,它跳过了没有销售记录的一周,将所有非零值相加。例如:对于第7周,sum over将第7、4、2、1周的销售额相加,计算结果为40。过去N周(包括销售为0的一周)的SQL销售总额,sql,amazon-redshift,window-functions,Sql,Amazon Redshift,Window Functions,我想显示每周4周销售额的总和当前一周加上前3周的每个项目 原始数据 预期的结果项a作为示例 我试着用 按项目订单按周划分的销售总额第3行 然而,它跳过了没有销售记录的一周,将所有非零值相加。例如:对于第7周,sum over将第7、4、2、1周的销售额相加,计算结果为40。 有什么方法可以达到预期的效果吗?如果你的桌子是桌子,每周都可以 SELECT sum(B.sales), A.week as curweek As totalsales FROM table A, table B WHERE
有什么方法可以达到预期的效果吗?如果你的桌子是桌子,每周都可以
SELECT sum(B.sales), A.week as curweek As totalsales
FROM table A, table B
WHERE curweek - B.week <4
AND curweek - B.week >=0
GROUP BY curweek
由于问题没有提到RDBMS,我在SQL Server中测试了以下代码。以下解决方案适用于SQL Server
我正在做以下活动:
生成周、项目的所有组合
对于组合,生成前4周的sumsales
删除原始列表中不存在的周
声明@table表项CHAR1,周TINYINT,销售INT
插入@table
值“a”、1、10、“a”、2、10、“a”、4、10、“a”、7、10、“a”、8、10、“a”、10、“b”、1、10、“b”、2、10、“b”、4、10、“b”、7、10、“b”、8、10、“b”、10、10;;
与CTE_项目周
像
选择项目,每周
从…起
值1、2、3、4、5、6、7、8、9、10
阿斯特威克
交叉连接
选择不同的项目
来自@table
A.
挑选*
从…起
选择t1。项目,案例
当t2.Week为空时
然后又过了一周
按t1划分。按t2划分项目顺序。每周
还有一周吗
本周结束,销售2.销售结束
按t1划分。按t1划分的项目顺序。前3行之间的周行
和当前行
作为总销售额
从CTE_ItemWeek开始,作为t1
左外联接@表为t1上的t2。项=t2。项
t1.week=t2.week
AS t
其中week不为空
结果集
如果您只需要查看现有周数的总和,而不需要填充缺少的周数,则可以在标准SQL中通过使用范围而不是行来实现这一点:
select item,
week,
sum (sales) over (partition by item order by week range between 3 preceding and current row)
from the_table
order by item, week;
如果您需要以行的形式填写缺少的周,那么答案在很大程度上取决于所使用的DBMS。在Postgres中,您可以执行以下操作:
with items as (
select distinct item
from data
), all_weeks as (
select i.item, g.week
from items i
cross join generate_series(1,10) as g(week)
)
select t.item,
t.week,
sum (d.sales) over (partition by t.item order by t.week range between 3 preceding and current row)
from all_weeks t
left join data d on d.item = t.item and d.week = t.week
对于其他DBMS系统,generate_系列调用可以替换为固定的周数:
select i.item, g.week
from items i
cross join ( values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10) ) as g(week)
显示您的代码。您使用的是哪种DBMS产品?SQL只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加。谢谢你的评论。我正在使用红移。如果我只需要计算当前周的数字,它将起作用。但是,我需要计算每周的结果。谢谢你的意见。你能解释一下你的方法吗?欢迎来到Stack Overflow!虽然这段代码可以解决这个问题,但如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设@一匹没有名字的马,对不起。我应该检查一下。我错过了,直接去找解决办法。我的错。“以后会小心的。”一匹没有名字的马同意了。用RDBMS信息更新了我的答案。
+------+------+-------------+
| Item | week | total_sales |
+------+------+-------------+
| a | 1 | 10 |
| a | 2 | 20 |
| a | 4 | 30 |
| a | 7 | 20 |
| a | 8 | 20 |
| a | 10 | 30 |
| b | 1 | 10 |
| b | 2 | 20 |
| b | 4 | 30 |
| b | 7 | 20 |
| b | 8 | 20 |
| b | 10 | 30 |
+------+------+-------------+
select item,
week,
sum (sales) over (partition by item order by week range between 3 preceding and current row)
from the_table
order by item, week;
with items as (
select distinct item
from data
), all_weeks as (
select i.item, g.week
from items i
cross join generate_series(1,10) as g(week)
)
select t.item,
t.week,
sum (d.sales) over (partition by t.item order by t.week range between 3 preceding and current row)
from all_weeks t
left join data d on d.item = t.item and d.week = t.week
select i.item, g.week
from items i
cross join ( values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10) ) as g(week)