更有效的方法是根据其他列值为SQL Server 2008中的列分配值

时间:2016-04-11 02:48:04

标签: sql sql-server sql-server-2008

我有一个包含5列的表格,如:

id value1 value2 value3 Score
1  X      X      X       
2  X      Y      Z       
3  Y      Z      Z       
4  X      Z      X  

我想要的是为每列分配等于Ys和Zs(而不是X)的最终值,如:

id value1 value2 value3 final
1  X      X      X       0
2  X      Y      Z       2
3  Y      Z      Z       3
4  X      Z      X       1

我这样做的方式是:

Update table 
set final = 3 
where value1 <> 'X' and value2 <> 'X' and value3 <> 'X'

Update table 
set final = 2 
where (value1 <> 'X' and value2 <> 'X' and value3 = 'X') 
   OR (value1 = 'X' and value2 <> 'X' and value3 <> 'X') 
   OR (value1 <> 'X' and value2 = 'X' and value3 <> 'X') 

Update table 
set final = 1 
where (value1 <> 'X' and value2 = 'X' and value3 = 'X') 
   OR (value1 = 'X' and value2 <> 'X' and value3 = 'X') 
   OR (value1 = 'X' and value2 = 'X' and value3 <> 'X') 

Update table 
set final = 0 
where value1 = 'X' and value2 = 'X' and value3 = 'X'

我想问一下是否有更聪明/更有效的方式而不是这个?任何意见,将不胜感激。谢谢!

4 个答案:

答案 0 :(得分:2)

这是你想要的吗?

Update table
     set final = ((case when value1 <> 'X' then 1 else 0 end) +
                  (case when value2 <> 'X' then 1 else 0 end) +
                  (case when value3 <> 'X' then 1 else 0 end)
                 );

这会计算不是X的值的数量。

这是另一种方法:

Update table
      set final = len(replace(value1 + value2 + value3, 'X', '');

注意:仅当列确实具有只包含一个字符的值时才有效。

答案 1 :(得分:0)

使用CASE WHEN。 。 。

Update table 
set    final = CASE WHEN value1<>'X' and value2<>'X' and value3<>'X' THEN 3
                    WHEN (value1<>'X' and value2<>'X' and value3='X') 
                    OR   (value1='X' and value2<>'X' and value3<>'X') 
                    OR (value1<>'X' and value2='X' and value3<>'X') THEN 2
                    WHEN (value1<>'X' and value2='X' and value3='X') 
                    OR (value1='X' and value2<>'X' and value3='X') 
                    OR (value1='X' and value2='X' and value3<>'X') THEN 1
                    WHEN value1='X' and value2='X' and value3='X' THEN 0 
                    END

答案 2 :(得分:0)

使用Computed列。如果没有获得所需的输出,请纠正我。

CREATE TABLE GRADES (
id INT
,VALUE1 VARCHAR(10)
,VALUE2 VARCHAR(10)
,VALUE3 VARCHAR(10)
,final INT AS (
    (
        CASE 
            WHEN value1 <> 'X'
                THEN 1
            ELSE 0
            END
        ) + (
        CASE 
            WHEN value2 <> 'X'
                THEN 1
            ELSE 0
            END
        ) + (
        CASE 
            WHEN value3 <> 'X'
                THEN 1
            ELSE 0
            END
        )
    )
); 

答案 3 :(得分:0)

create TRIGGER test
   ON [dbo].[YourTable]
   AFTER  INSERT
AS 
BEGIN
    declare @Id     int
    declare @value1     nvarchar(10)
    declare @value2     nvarchar(10)
    declare @value3     nvarchar(10)
    declare @Count  int =0

    select top(1) @Id=id, @value1=[m1] ,@value2=[m2],@value3=[m3]   from [dbo].[Table_3] order by id DESC
    if @value1='x'
    begin
    set @Count=@Count+1
    end
    if @value2='x'
    begin
    set @Count=@Count+1
    end
    if @value3='x'
    begin
    set @Count=@Count+1
    end
    update [dbo].[Table_3]
    set Score=@Count
    where id =@Id
END