列值是varchar,需要转换为十进制.列名为日期格式.sql服务器



我有一个表tblSample,它的列名作为日期格式值,即[202007]、[202006]-[202001],数据类型为varchar

我想用[202006]-[202005]更新tblSample的另一列(X(,用[202005]-[202004]更新列(Y(。我使用下面的查询,它为所有记录(tblSample中大约有50条记录(提供1的输出。

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值执行减法。

我哪里出了问题?我的更新查询、更新列-X和列Y的值对表中的每一行都正确吗

tblSample[2006]-3565.24、[2005]-3461.36、[2004]-3510.36栏中的值。输出

谢谢Shyam

您可以使用列名进行更新:

update tblsamples
set x = [202006]-[202005],
y = [202005]-[202004] ;

更改表中的名称是一个非常糟糕的主意。相反,你应该每月有一排。然后,您可以使用lag():轻松计算差异

select t.*, (value - lag(value) over (partition by ? order by yyyymm)) as diff
from t;

如有必要,也许可以重新调整。

如果你每个月都在构建表格,那么你也应该构建差异。或者,也许更简单地说,只需添加名为latest_monthprevious_month的列,并在update中使用它们。

最后,如果您一直使用这种格式,则需要使用动态SQL。不过,这似乎是个坏主意。

最新更新