在范围内应用计算

时间:2019-11-05 09:27:59

标签: sql sql-server sql-server-2012

我有下表

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

我正在尝试创建一个附加列,该列为所有类型为“ Except”的emp行分配一个值“ 1”

下面是我的预期输出,

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 个答案:

答案 0 :(得分:1)

尝试使用CASE,请参见下面的示例。

Select id, emp_name, type,
case
        when type = 'Except' then 1
        else 0
end as calc
from
table

答案 1 :(得分:1)

您可以尝试以下方式-使用窗口功能

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

答案 2 :(得分:0)

首先,您必须添加一列

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' 
)

答案 3 :(得分:0)

使用窗口功能。因为您只需要01,所以我建议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;