如何在SQL中按年汇总数据?

时间:2018-08-20 19:43:09

标签: sql sas proc-sql

我确定请求很简单,但是我被卡住了。我想通过将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                        |
+-------------+-----------+---------------------------+

2 个答案:

答案 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,那么时间序列任务将为您完成此任务。假设没有,这是一个数据步骤解决方案。

  • 使用RETAIN跨行保存值
  • 使用BY来标识每年的第一条记录

    data want;
    set have;
    by year;
    retain cum_total;
    
    if first.year then cum_total=incremental_inventory;
    else cum_total+incremental_inventory;
    run;