Измените последние 2 номера в Случае, если

#sql #sql-server #case

Вопрос:

Пытаюсь создать новый столбец «FiscalQrtr», который использует столбец «Дата» в случае, когда, но не могу понять это, поэтому я выбрал подход обновления и получаю сообщение об ошибке, в котором говорится

«Не удалось выполнить преобразование при преобразовании значения varchar «» в тип данных int».

Столбец даты , по моему мнению, таков YYYYMM , поэтому примером результата будет: если Дата = 200103, то FiscalQrtr = 200101

Код обновления выглядит следующим образом:

 select * 
into #claims1 
FROM #claims 

update #claims1
set Date = left(Date, len(Date)-2)   '01'
where Date in ('','','');
 

Любая помощь будет высоко оценена

Комментарии:

1. TxnFiscalPeriod это явно an int , так что ошибка здесь очень ясна.

2. where TxnFiscalPeriod % 100 BETWEEN 1 AND 3

3. Все еще не уверен, как выполнить поставленную задачу… необходимо использовать дату (столбец содержит серию ГГГГ ) для преобразования последних 2 символов в правильный финансовый квартал.

4. select * into #claims1 FROM #claims Это полная чушь.

Ответ №1:

Почему бы просто не сделать все 4 квартала сразу?

 UPDATE #claims1
SET Date = LEFT(Date, 4)   '0'   RTRIM((RIGHT(Date,2)-1)/3 1);
 

Если вам не нравится неинтуитивная -1/3 1 математика, вы можете написать что-то гораздо более ясное по намерению:

 UPDATE #claims1 SET Date = LEFT(Date, 4)   '0'  
  RTRIM(DATEPART(QUARTER, DATEFROMPARTS(LEFT(Date,4), RIGHT(Date,2), 1)));
 

Если вы просто хотите по какой-то причине обработать Q1, хорошо, просто добавьте:

 WHERE RIGHT(RTRIM(Date),1) < 4;
 

Ответ №2:

Если Date столбец на самом деле представляет собой 6-значное целое число YYYYMM , вы можете использовать для этого немного арифметики:

 update #claims1
set Date = (Date / 100 * 100)   1
where Date % 100 <= 3;
 

(Date / 100 * 100) усекает его, затем вы просто добавляете 1

Вы также можете выполнить все четыре четверти одновременно

 update #claims1
set Date = (Date / 100 * 100)   (Date % 100 / 4 * 3   1);
 

Ответ №3:

Это связано с тем, что тип данных вашей даты столбца является INT и INT с ним нельзя использовать тип данных LIKE . Поэтому вместо этого преобразуйте столбец в VARCHAR и выполните обновление. Подобный этому

 update #claims1
set Date = left(CAST(Date AS VARCHAR(20)), len(CAST(Date AS VARCHAR(20))-2))   '01'
where RIGHT(CAST(Date AS VARCHAR(20)),2) in ('01','02','03');
 

Комментарии:

1. Получение «неправильного синтаксиса рядом с местом»

2. @2020db9, скобка отсутствовала. обновлено сейчас