我有一个包含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'
我想问一下是否有更聪明/更有效的方式而不是这个?任何意见,将不胜感激。谢谢!
答案 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