Как обновить значения в одном столбце на основе данных из другого столбца SQL Server 2014 - PullRequest
0 голосов
/ 22 апреля 2019

Я хотел бы обновить значения в столбце на основе информации из другого столбца в SQL Server 2014. Формат таблицы следующий (примечание: нулевые значения отсутствуют).

Первый сценарий:

 ID        Name                Values   TimeStamp
----   ------------------      ------   ---------
1000   ARMS Cyl L RU             10       12:00
1000   ARMS Cyl R RU             20       12:00
1000   ARMS Sph L RU             30       12:00
1000   ARMS Sph R RU             40       12:00
1000   HANDS Cylin L RU          50       12:00
1000   HANDS Cylin R RU          60       12:00
1000   HANDS Sphere L RU         70       12:00
1000   HANDS Sphere R RU         80       12:00 

Ожидаемый результат:

 ID        Name                Values   TimeStamp
----   ------------------      ------   ---------
1000   ARMS Cyl L RU             10       12:00
1000   ARMS Cyl R RU             20       12:00
1000   ARMS Sph L RU             30       12:00
1000   ARMS Sph R RU             40       12:00
1000   HANDS Cylin L RU          10       12:00
1000   HANDS Cylin R RU          20       12:00
1000   HANDS Sphere L RU         30       12:00
1000   HANDS Sphere R RU         40       12:00 

Второй сценарий:

 ID        Name                Values   TimeStamp
----   ------------------      ------   ---------
1000   ARMS Cyl L RU             10       12:00
1000   ARMS Cyl R RU             20       12:00
1000   HANDS Cylin L RU          50       12:00
1000   HANDS Cylin R RU          60       12:00
1000   HANDS Sphere L RU         70       12:00
1000   HANDS Sphere R RU         80       12:00 

Ожидаемый результат:

 ID        Name                Values   TimeStamp
----   ------------------      ------   ---------
1000   ARMS Cyl L RU             10       12:00
1000   ARMS Cyl R RU             20       12:00
1000   HANDS Cylin L RU          10       12:00
1000   HANDS Cylin R RU          20       12:00
1000   HANDS Sphere L RU         70       12:00
1000   HANDS Sphere R RU         80       12:00 

Логика кода следующая (это только для пояснения), мне нужно показать результаты запроса к базе данных, как показано в ожидаемом выводе:

if('ARMS Cyl L RU' = '')
{
     /*take value from 'HANDS Cylin L RU'*/ 
}
else
{
     /*the value is empty*/
}
/* continue on for the next 3 values for ARMS Cyl R RU, ARMS Sph L RU, ARMS Sph R RU*/

Мне нужно написать запрос, чтобы показать ожидаемый результат. Любая помощь будет оценена!

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Если я понимаю ваши требования, вы хотите обновить значение в поле Значения, чтобы отразить число для продуктов ARMS на основе соответствующих продуктов HANDS.где вам нужно сопоставить их на основе Cyl = Cylin и Sph = Sphere.

В вашем примере все записи имеют одинаковый идентификатор, равный 1000. Я надеюсь, что это не так.Выглядит так, как будто вы должны попытаться стандартизировать свой список предметов инвентаря, и только потом беспокоиться о цифрах.(предложение: создайте новую таблицу с двумя столбцами: один - текущие имена, а второй - желаемый столбец в новой таблице и продолжайте оттуда).

Между тем, я думаю, этот кодадрес вашего конкретного запроса:

with myTable as (
    select
        [Name] as OriginalName,
        replace(
            replace(
                replace(
                    [Name],
                'HANDS','ARMS'),
            'Cylin','Cyl'),
            'Sphere','Sph') as StandardName,
        [Values]
    from YOURTABLENAMEHERE
)


update t0
set [Values] = t1.[Values]
from
    myTable t0
    inner join
    myTable t1
        on (t0.StandardName = t1.StandardName and t0.OriginalName <> t1.OriginalName)
where
    t0.OriginalName like 'HANDS%'
0 голосов
/ 22 апреля 2019

Я думаю, вам нужно использовать слияние для этого.Вот мой запрос для этого.Я желаю, чтобы это решило вашу проблему.

MERGE INTO first_scenario f
   USING second_senario s
   ON (f.name=s.name)
   WHEN MATCHED THEN 
     UPDATE SET f.id=s.id,
        f.name=s.name,
        f.values=s.values,
        f.timestamp=s.timestamp
   WHEN NOT MATCHED THEN INSERT 
     VALUES (select s.id,
        s.name,
        s.values,
        s.timestamp from second_scenario);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...