我有一张table tblSample
其中列名称作为日期格式值,即[202007]、[202006]--[202001],数据类型为 varchar
.
我要更新的另一列(x) tblSample
带[202006]-[202005],列(y)带[202005]-[202004]。我正在使用下面的查询,它将所有记录的输出设为1(大约50条记录) tblSample
).
UPDATE tblSample
SET
X = CAST(ISNULL(SELECT LEFT(CONVERT(varchar, DATEADD(month, -3, GETDATE(), 112), 6)), 0) AS DECIMAL(18,2)) - CAST(ISNULL((SELECT LEFT(CONVERT(varchar, DATEADD(month, -4, GETDATE()), 112), 6)), 0) AS DECIMAL(18, 2))
我正在使用 LEFT(CONVERT(varchar, DATEADD(month, -3, GETDATE(), 112), 6))
因为列名值将每个月更新到当前月份。
我必须将varchar转换为十进制,因为我得到的错误是不能对varchar值执行减法。
哪里出错了?我的update查询,更新表中每一行的column-x和column-y值是否正确
tblsample[2006]-3565.24、[2005]-3461.36、[2004]-3510.36列中的值。输出
谢谢,希亚姆
1条答案
按热度按时间wko9yo5t1#
可以使用列名进行更新:
在表中更改名称是一个非常糟糕的主意。你应该每个月有一行。然后可以使用
lag()
:如果必要的话,也许可以重新旋转。
如果您每个月都在构造表,那么您也应该构造差异。或者,更简单地说,只需添加名为
latest_month
以及previous_month
把它们用在update
.最后,如果您一直使用这种格式,则需要使用动态sql。不过,这似乎是个坏主意。