【问题标题】:SQL YTD on each Month per Year每年每个月的 SQL YTD
【发布时间】:2018-05-09 01:42:19
【问题描述】:

我有下表:

oDate        oValue
----------------------------
2017-01-01   40
2017-02-01   50
2017-03-01   60
2017-04-01   10

每个月只有一个数据。
然后,我想得到以下结果:

oDate        oValue         YTD
----------------------------------------
2017-01-01   40             40
2017-02-01   50             90
2017-03-01   60             150
2017-04-01   10             160

因此,YTD 的值是上个月的oValue 的总和,它将在选定年份的 12 月结束。当新的Year开始时,会忽略上一年重新计算。

有人有这个想法吗?
谢谢。

【问题讨论】:

    标签: sql tsql sql-server-2014


    【解决方案1】:

    只需使用运行总和功能:

    select odate, ovalue,
           sum(ovalue) over (partition by year(odate) order by odate) as ytd
    from t;
    

    这是一个窗口函数。 partition by 每年重新计算总和。 order by 做一年内的累计。

    【讨论】:

      【解决方案2】:

      一个选项使用相关子查询来查找累计总数:

      SELECT
          t1.oDate,
          t1.oValue,
          (SELECT SUM(t2.oValue) FROM yourTable t2
           WHERE t2.oDate <= t1.oDate AND YEAR(t1.oDate) = YEAR(t2.oDate)) AS YTD
      FROM yourTable t1
      ORDER BY t1.oDate;
      

      Demo

      【讨论】:

      • 如果我在不同年份添加新日期,它不会忽略前一年。
      • @Haminteu 我添加了一个检查,以便每年单独计算累积总和。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      相关资源
      最近更新 更多