#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). Это динамическое поле, и я бы не знал списки.