我确定请求很简单,但是我被卡住了。我想通过将Incremental_Inventory
乘以Year
来汇总下面的第一张表,并将其转换为第二张表。
+-------------+-----------+----------------------+-----+
|Warehouse_ID |Date |Incremental_Inventory |Year |
+-------------+-----------+----------------------+-----+
| 1|03/01/2010 |125 |2010 |
| 1|08/01/2010 |025 |2010 |
| 1|02/01/2011 |150 |2011 |
| 1|03/01/2011 |200 |2011 |
| 2|03/01/2012 |125 |2012 |
| 2|03/01/2012 |025 |2012 |
+-------------+-----------+----------------------+-----+
到
+-------------+-----------+---------------------------+
|Warehouse_ID |Date |Cumulative_Yearly_Inventory|
+-------------+-----------+---------------------------+
| 1|03/01/2010 |125 |
| 1|08/01/2010 |150 |
| 1|02/01/2011 |150 |
| 1|03/01/2011 |350 |
| 2|03/01/2012 |125 |
| 2|03/01/2012 |150 |
+-------------+-----------+---------------------------+
答案 0 :(得分:1)
如果您尚未告知我们的DBMS支持窗口功能,则可以执行以下操作:
SELECT warehouse_id,
date,
sum(incremental_inventory) OVER (PARTITION BY warehouse_id,
year(date)
ORDER BY date) cumulative_yearly_inventory
FROM elbat
ORDER BY date;
year()
可能需要用您的DBMS提供的从日期中提取年份的方式代替。
如果它不支持窗口函数,则必须使用子查询和聚合。
SELECT t1.warehouse_id,
t1.date,
(SELECT sum(t2.incremental_inventory)
FROM elbat t2
WHERE t2.warehouse_id = t1.warehouse_id
AND year(t2.date) = year(t1.date)
AND t2.date <= t1.date) cumulative_yearly_inventory
FROM elbat t1
ORDER BY t1.date;
但是,如果有两个相等的日期,则这两个日期将打印相同的总和。一个人需要另一个不同的列来进行排序,据我所知,表中没有这样的列。
我不确定您是要在所有仓库中还是仅在每个仓库中求和。如果您不希望将总和按仓库划分,而是将所有仓库的总和一并,请从PARTITION BY
或内部WHERE
子句中删除相应的表达式。
答案 1 :(得分:0)
如果您具有SAS / ETS,那么时间序列任务将为您完成此任务。假设没有,这是一个数据步骤解决方案。
使用BY来标识每年的第一条记录
data want;
set have;
by year;
retain cum_total;
if first.year then cum_total=incremental_inventory;
else cum_total+incremental_inventory;
run;