Sql 在同一个表中合并大小写

Sql 在同一个表中合并大小写,sql,sql-server,Sql,Sql Server,我正在使用SQL Server 2014。 我的桌子叫TF,这是我到目前为止的桌子 +-----------+------------+--------+--------------+ | IdProduct | Month | Sales | Accumulation | +-----------+------------+--------+--------------+ | DSN101 | 01/01/2014 | 100 | ((1)) | | DS

我正在使用SQL Server 2014。 我的桌子叫TF,这是我到目前为止的桌子

+-----------+------------+--------+--------------+
| IdProduct | Month      | Sales  | Accumulation |
+-----------+------------+--------+--------------+
| DSN101    | 01/01/2014 | 100    | ((1))        |
| DSN101    | 01/02/2014 | 50     | 50           |
| DSN101    | 01/03/2014 | 250    | 300          |
+-----------+------------+--------+--------------+
IdProduct是一个字符串 月是一个日期 销售和积累是浮动的

累积列最初为null,接下来的操作不起作用,因此我将默认值设置为1。 以下是我更新表格并填充表格的方式:

GO
MERGE INTO dbo.TF as A
USING dbo.TF as P
ON (A.IdProduct = P.IdProduct and MONTH(P.Month)=MONTH(A.Month)-1 and YEAR(P.Month)=YEAR(A.Month))
WHEN MATCHED THEN
UPDATE SET A.Accumulation = CASE
    WHEN P.Accumulation Is not null then P.Accumulation+A.Sales-1
    WHEN MONTH(A.Month)=1 and not exists(select P.Sales) then A.Sales
END; 
所以一开始这一切都不起作用,因为第一个空会导致第二个空,然后是第三个空。。 现在第一种情况很好,第二种情况不行,我不明白为什么。 我尝试了许多组合,但都没有成功。我需要的是,对于每年的第一个月,累加列等于销售列。 我知道我的代码会让每一行查找上一行,但我不知道如何让它在一月份停止。
请帮帮我

您似乎希望在列中包含值的累积和。您不需要将其存储在表中,只需从查询中获取:

select tf.*, sum(sales) over (order by month) - sales
from tf;
销售额减少是因为累计似乎不包括当月的销售额。如果您只需要merge语句所建议的当前年份的分区,则通过以下方式添加分区:

如果您真的想将其包含在表中,以下是可更新的表达式:

with toupdate as (
      select tf.*, sum(sales) over (order by month) - sales as newval
      from tf
     )
update toupdate
    set accumulation = newval;

与其使用dbo.TF,不如使用select*from dbo.TF where?如果您直接在使用条件上进行更改,它将使更新更容易…我没有想到。它也有效,谢谢!非常感谢。最后一个就是我所需要的:更新TF SET acumalitve=SELECT SUMx.Sales FROM TF x WHERE Monthx.Month
with toupdate as (
      select tf.*, sum(sales) over (order by month) - sales as newval
      from tf
     )
update toupdate
    set accumulation = newval;