Применить расчет по всему диапазону - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть таблица ниже,

ID Emp_Name  Type
1  JDoe      Except 
1  JDoe      NTF
1  JDoe      JD
1  JDoe      NULL
2  Kevin     NTF
2  Kevin     FTP
3  Rob       NTF

Я пытаюсь создать дополнительный столбец, который присваивает значение '1' всем строкам emp, которые имеют тип "Except"

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

ID Emp_Name  Type    Calc
1  JDoe      Except  1
1  JDoe      NTF     1
1  JDoe      JD      1
1  JDoe      NULL    1
2  Kevin     NTF     0
2  Kevin     FTP     0
3  Rob       NTF     0

Я ищу идеи для этого с помощью оператора apply (я пробовал несколько запросов с использованием подзапросов, но он работает не так хорошо, поэтомуЯ ищу другой подход).

Ответы [ 4 ]

1 голос
/ 05 ноября 2019

Вы можете попробовать следующий способ - используя оконную функцию

DEMO

select *,
      count(case when types='Except' then 1 end) over(partition by emp_name order by id) as calc
from tablename

ВЫХОД:

id  emp_name    types   calc
1   JDoe        Except  1
1   JDoe        NTF     1
1   JDoe        JD      1
1   JDoe                1
2   Kevin       NTF     0
2   Kevin       FTP     0
3   Rob         NTF     0
1 голос
/ 05 ноября 2019

Попробуйте использовать CASE, см. Пример ниже.

Select id, emp_name, type,
case
        when type = 'Except' then 1
        else 0
end as calc
from
table
0 голосов
/ 05 ноября 2019

Используйте функцию окна. Поскольку вы хотите просто 0 или 1, я бы порекомендовал max():

select t.*,
       max(case when type = 'Except' then 1 else 0 end) over (partition by type) as calc
from t;

Если бы calc был фактически столбцом в таблице и вы хотите его заполнить, используйте update:

with toupdate as (
      select t.*,
             max(case when type = 'Except' then 1 else 0 end) over (partition by type) as new_calc
      from t
     )
update toupdate
    set calc = new_calc;
0 голосов
/ 05 ноября 2019

Сначала необходимо добавить столбец

ALTER TABLE #Temp   //YourTableName
ADD Calc INT NOT NULL DEFAULT (0)

Затем использовать запрос на обновление ....

UPDATE  #Temp
SET     Calc = 1
WHERE ID IN 
(
    SELECT ID FROM #Temp  WHERE [TYPE]='Except' 
)
...