【问题标题】:Sum of numbers from previous year month until this years month in SQLSQL中从上一年月到今年月的数字总和
【发布时间】:2018-11-28 20:39:14
【问题描述】:

作为一个初学者,我很难在 SQL Server 2008 中编写这个特定场景

如您所见, 例如,2017 年 7 月的 SUM 列等于以下内容: 2016 年 8 月至 12 月 + 2017 年 1 月至 7 月 = 4625

同样,2017 年 8 月的 SUM 列等于以下内容: 2016 年 9 月至 12 月 + 2017 年 1 月至 8 月 = 4625

我怎样才能每月自动执行此操作?

感谢我能得到的任何帮助。尝试在 SQL Server 2008 中编写此代码

【问题讨论】:

  • 这在 2008 年比在 2012 年困难得多,因为在使用 OVER 时您无法访问 ROWS BETWEEN 子句。考虑到 2008 年不再支持,而且我们几乎达到了扩展支持的终点,您是否考虑过更新?你有选择吗?
  • 遗憾的是我现在不知道。我们将很快升级到 2014 年,但那可能是明年年底。 2008年有没有办法做到这一点?
  • 没有SUM([Numbers]) OVER (ORDER BY YourDateColumn ASC ROWS BETWEEN 11 PRECEDING AND CURRENT ROW)那么简单
  • 这是在 2008 年?
  • 不,这是我的意思。

标签: sql sql-server sql-server-2008


【解决方案1】:

使用此方法查找当月的第一天:

select dateadd(month, datediff(month, 0, getdate()), 0)

我们可以扩展它以获得下个月的第一天,一年前...即 11 个月前。

select dateadd(month, datediff(month, 0, dateadd(month,-11,getdate())), 0)

然后,我们只需要在 where 子句中使用它来限制您的数据...

declare @startDate = (select dateadd(month, datediff(month, 0, dateadd(month,-11,getdate())), 0))
declare @endDate = getdate()

select sum(someColumn)
from someTable
where dateColumn between @startDate and @endDate

由于您没有提供实际数据集,只是提供了一些透视数据,我不确定您的列名和表名

【讨论】:

  • 谢谢,这会将 2017 年的“数字总和”列返回给我。我需要获取 SUM 列
  • 啊,你想要一个窗口函数,或者在这种情况下是一个相关的子查询。实际的列名是什么?
  • 列名是年、月和数字。希望有帮助,我还需要在 SQL Server 2008 中运行查询
【解决方案2】:

这听起来像你想要窗口函数。假设您的数据已经按月汇总:

select t.*,
       sum(numbers) over (order by yyyymm rows between 11 preceding and current row) as prev_12_sum
from t;

如果数据尚未汇总,您也可以将其放入group by

select year(date), month(date),
       sum(sum(numbers)) over (order by year(date), month(date) rows between 11 preceding and current row) as prev_12_sum
from t
group by year(date), month(date)
order by min(date);

【讨论】:

  • 谢谢戈登。您可以修改它以使其在 SQL Server 2008 中工作吗?
猜你喜欢
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多