【问题标题】:Calculate sum to five years back in SQL Server在 SQL Server 中计算五年前的总和
【发布时间】:2016-11-23 07:56:15
【问题描述】:

我正在使用选择:

Select year, month, par1, par2, par3, value 
from table1

制作这张表:

现在,我想计算五年前的总和(即 60 个月)。

结果应该如下:

我该怎么做?

【问题讨论】:

  • 你的月份列是字符串吗?任何日期列或整数?
  • 您如何确定五年跨度应该从哪一年开始?
  • 是:年、月、par1、par2、par3是String
  • @Tim -> 对于每一行,你应该得到五年前的总和,即使对于某些行你不能有数据
  • 为什么年份和月份是字符串?这是您现有查询的结果吗?

标签: sql-server sql-server-2008 datetime sum date-arithmetic


【解决方案1】:

对于你的情况,由于表格是字符串,我使用 CTE 来制定所需计算的日期列

; with
cte as
(
    select  *, date = convert(date, year + '-' + substring(month, 2, 2) + '-01', 121)
    from    table1
)
select  *
from    cte c
    outer apply
    (
        select  SumOfValue = sum(Value)
        from    cte x
        where   x.date  >= dateadd(month, -60, c.date)
        and x.date  <= c.date
    ) t

如果您需要 sum() 按其他列分组,请将条件添加到 OUTER APPLY 查询

编辑 1:

select  *
from    cte c
    outer apply
    (
        select  SumOfValue = sum(x.Value)
        from    cte x
        where   x.date  >= dateadd(month, -60, c.date)
        and     x.parameter1 = c.parameter1
        and     x.parameter2 = c.parameter2
        and     x.date      <= c.date
    ) t

【讨论】:

  • dateadd(month, -60, c.date) -> 我应该在这里将月份转换为日期吗?因为我收到错误“'date' 不是可识别的 dateadd 选项。”
  • 您使用的是SQL Server 2008 对吗?那应该工作。如果不在 cte 中,请使用 date = convert(datetime, ...)
  • date = convert(date or date = convert(datetime....正在工作,我遇到的错误:其中 x.date >= dateadd(date, -60, c.date)
  • 应该是dateadd(month, -60, c.date)
  • 我的查询是正确的。 month 中的dateadd() 是关键字。您应该避免使用保留字作为列名。会造成混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 2010-10-26
  • 2021-10-02
  • 1970-01-01
相关资源
最近更新 更多