значение столбца - varchar, которое необходимо преобразовать в десятичное. имя столбца в формате даты. sql сервер - PullRequest
0 голосов
/ 09 июля 2020

У меня есть таблица 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 в decimal, поскольку я получаю сообщение об ошибке, что вычитание не может быть выполнено для значений varchar.

Где я ошибаюсь и будет ли мой запрос на обновление, обновляет значение столбца X и столбца Y правильно для каждой строки в таблице

Значения в столбцах tblSample [2006] -3565.24, [2005] -3461.36, [2004] -3510.36. Вывод

Спасибо, Шьям

1 Ответ

0 голосов
/ 09 июля 2020

Вы можете выполнить обновление, используя имена столбцов:

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.

Наконец, если вы застряли в этом формате, вам нужно будет использовать динамический c SQL. Хотя это кажется плохой идеей.

...