SQL Server: обновить столбец из таблицы, если одна из записей > = X

#sql-server #tsql #int

#sql-сервер #tsql #int

Вопрос:

Мне нужна помощь в обновлении одного из моих столбцов в существующей временной таблице каждый раз, когда один из показателей равен> = 4.

Ниже приведен мой запрос, над которым я работаю:

 DECLARE @Met NVARCHAR(MAX)
SET @Met = 'MET'

DECLARE @NotMet NVARCHAR(MAX)
SET @NotMet = 'NOT MET'

UPDATE #TmpTbl
SET Score_Oct = (CASE 
                    WHEN ([Type] LIKE '%Metric%') AND CAST(Score_Oct AS INT) >= 4 
                       THEN @NotMet 
                       ELSE @Met 
                 END),
    Score_Nov = (CASE 
                    WHEN ([Type] LIKE '%Metric%') AND CAST(Score_Nov AS INT) IN (4, 5, 6) 
                       THEN @NotMet 
                       ELSE @Met 
                 END),
    Score_Dec = (CASE 
                    WHEN ([Type] LIKE '%Metric%') AND Score_Dec IN ('4', '5', '6') 
                       THEN @NotMet 
                       ELSE @Met 
                 END),
    Score_Jan = (CASE 
                    WHEN ([Type] LIKE '%Metric%') AND Score_Jan IN ('4', '5', '6') 
                       THEN @NotMet 
                       ELSE @Met 
                 END),
    Score_Feb = (CASE 
                    WHEN ([Type] LIKE '%Metric%') AND Score_Feb IN ('4', '5', '6') 
                       THEN @NotMet 
                       ELSE @Met 
                 END)
    ,Score_Mar = (CASE WHEN ([Type] LIKE '%Metric%') AND Score_Mar      IN ('4','5','6') THEN @NotMet ELSE @Met END)
    ,Score_Apr = (CASE WHEN ([Type] LIKE '%Metric%') AND Score_Apr      IN ('4','5','6') THEN @NotMet ELSE @Met END)
    ,Score_May = (CASE WHEN ([Type] LIKE '%Metric%') AND Score_May      IN ('4','5','6') THEN @NotMet ELSE @Met END)
    ,Score_Jun = (CASE WHEN ([Type] LIKE '%Metric%') AND Score_Jun      IN ('4','5','6') THEN @NotMet ELSE @Met END)
    ,Score_Jul = (CASE WHEN ([Type] LIKE '%Metric%') AND Score_Jul      IN ('4','5','6') THEN @NotMet ELSE @Met END)
    ,Score_Aug = (CASE WHEN ([Type] LIKE '%Metric%') AND Score_Aug      IN ('4','5','6') THEN @NotMet ELSE @Met END)
    ,Score_Sep = (CASE WHEN ([Type] LIKE '%Metric%') AND Score_Sep      IN ('4','5','6') THEN @NotMet ELSE @Met END)
WHERE
    Metric = 'Balance Scorecard'
  

Я пробовал разные комбинации (приведение, обработка поля как INT, text и т. Д.), Но безрезультатно. Есть ли что-нибудь, что я пропустил?

Ниже приведен набор результатов:

 Metric             Type                   Result_Oct    Score_Oct   Result_Nov     Score_Nov
AA                 1.Monthly Metric       3             3           NULL            NULL
BB                 1.Monthly Metric       292           3           300             3
CC                 1.Monthly Metric       3             3           NULL            NULL
DD                 2.Half Yearly Metric   70            3           NULL            NULL
EE                 2.Half Yearly Metric   100           1           67              4
Balance Scorecard  3.Accountability       NULL          MET         NULL            MET
  

Балансовая оценочная карточка должна быть «НЕ ВЫПОЛНЕНА» для «Score_nov», поскольку показатель EE равен> = 4, но, похоже, запрос не может подтвердить числа. Это из-за полей, которые имеют значение null?

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

1. Можете ли вы предоставить некоторые примеры исходных данных?

Ответ №1:

Проблема в том, что значения находятся в разных строках. Итак, вам нужно JOIN , чтобы объединить их.

Вот пример для ноября. Остальные месяцы в основном те же:

 UPDATE t
    SET score_Nov = (CASE WHEN CAST(tt.Score_Nov AS INT) >= 4
                          THEN @NotMet ELSE @Met
                     END)
    FROM #TmpTbl t CROSS JOIN
         #TmpTbl tt
    WHERE t.metric = 'Balance Scorecard' AND tt.metric = 'EE';
  

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

1. Привет, Гордон, как я могу сделать его шаблоном? В вашем примере это только в том случае, если метрика равна «EE». Я не хочу в одиночку обрабатывать каждую запись. Есть ли другой способ? Мне нужно, чтобы он повторялся каждый месяц для всех показателей..

2. @lucas . , , Вы можете обрабатывать все месяцы, просто добавляя дополнительные столбцы в set предложение. Я не понимаю, что вы подразумеваете под дополнительными показателями.

3. Привет, Гордон, меня беспокоит предложение where. это также просматривает столбец «метрика» (например, AA, BB, CC, DD, EE). Это динамическое поле, и я бы не знал списки.