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

iyr7buue  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(237)

我有一张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列中的值。输出
谢谢,希亚姆

wko9yo5t

wko9yo5t1#

可以使用列名进行更新:

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_month 以及 previous_month 把它们用在 update .
最后,如果您一直使用这种格式,则需要使用动态sql。不过,这似乎是个坏主意。

相关问题