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