#sql #sql-server #ssms
Вопрос:
Привет, у меня есть стол, накрытый, как показано ниже
clientId lev1 lev2 lev3 lev4 lev5
1 low very-low high low very-high
Я хочу сопоставить значение INT для low =2 ,very-low =1 ,high =4 ,very-high =5.
затем мне нужно найти сумму для каждого клиента .
здесь мне нужно добраться (2 1 4 2 5) = 14 Как я могу это сделать ?
Комментарии:
1. Вы имеете в виду карту , а не назначение. Создайте отдельную таблицу с отображением и объединитесь с ней
2. да, я хочу составить карту . извини за это . — поправил Кус.
3. Используйте
CASE
выражение иSUM
эти значения.4. я сделал это, брат . спасибо за помощь .
Ответ №1:
Я бы предложил использовать apply
. На самом деле, вам вообще не нужны case
выражения лица:
select t.*, v.total
from t cross apply
(select sum(v2.val) as total
from (values (t.lev1), (t.lev2), (t.lev3), (t.lev4), (t.lev5)
) v(lev) join
(values ('low', 2), ('very-low', 1), ('high', 4), ('very-high', 5)
) v2(lev, val)
on v.lev = v2.lev
) v;
В основном это делается для того, чтобы отменить вывод уровней из пяти столбцов в пять строк (в подзапросе). Затем он сопоставляет их со значениями, которые вы указали. Наконец, sum()
добавляет их все в один ряд.