假设有张表(CJ)如下
fd1 fd2 fd3 fd4 fd5
20 80 80 0 0
56 34 90 0 0
55 35 100 0 0现在 想写 UPDATE 语句 结果 为
fd1 fd2 fd3 fd4(fd1,fd2,fd3中最大的) fd5(其他两个相加)
20 80 80 80 100(80+20)
56 34 90 90 90(56+34)
55 35 100 100 90(56)
用什么方法写最高效?我认为应该要用到行操作的方法.把fd1,fd2,fd3行转列后再用MAX取出最大的放到fd4,其他放到fd5..
但是我不知道具体怎么写..有点小菜..呜
fd1 fd2 fd3 fd4 fd5
20 80 80 0 0
56 34 90 0 0
55 35 100 0 0现在 想写 UPDATE 语句 结果 为
fd1 fd2 fd3 fd4(fd1,fd2,fd3中最大的) fd5(其他两个相加)
20 80 80 80 100(80+20)
56 34 90 90 90(56+34)
55 35 100 100 90(56)
用什么方法写最高效?我认为应该要用到行操作的方法.把fd1,fd2,fd3行转列后再用MAX取出最大的放到fd4,其他放到fd5..
但是我不知道具体怎么写..有点小菜..呜
INSERT INTO @tb
SELECT 20, 80, 80, 0, 0
UNION ALL SELECT 56, 34, 90, 0, 0
UNION ALL SELECT 55, 35, 100, 0, 0DECLARE @MAX INT
UPDATE @tb
SET @MAX = CASE WHEN FD1 >= FD2 AND FD1 >= FD3 THEN FD1
WHEN FD2 >= FD1 AND FD2 >= FD3 THEN FD2
WHEN FD3 >= FD1 AND FD3 >= FD2 THEN FD3 END,
FD4 = @MAX,
FD5 = @MAX + FD1
SELECT * FROM @tb
update fd4=case when fd1>fd2
then case when fd1>fd3 then fd1 else fd3 end
else case when fd2>fd3 then fd2 else fd3 end
end
set fd5=fd1+fd2+fd3-fd4
set fd4=case when fd1>=fd2 and fd1>=fd3 then fd1
when fd2>=fd1 and fd2>=fd3 then fd2
else fd3
end,
fd5=fd1+fd2+fd3-case when fd1>=fd2 and fd1>=fd3 then fd1
when fd2>=fd1 and fd2>=fd3 then fd2
else fd3
end
DECLARE @tb TABLE([fd1] int, [fd2] int, [fd3] int, [fd4] int, [fd5] int)
INSERT INTO @tb
SELECT 20, 80, 80, 0, 0
UNION ALL SELECT 56, 34, 90, 0, 0
UNION ALL SELECT 55, 35, 100, 0, 0update @tb
set fd4=case when fd1>fd2
then case when fd1>fd3 then fd1 else fd3 end
else case when fd2>fd3 then fd2 else fd3 end
endupdate @tb
set fd5=fd1+fd2+fd3-fd4select * from @tb
/*
fd1 fd2 fd3 fd4 fd5
----------- ----------- ----------- ----------- -----------
20 80 80 80 100
56 34 90 90 90
55 35 100 100 90
*/
returns int
as
begin
declare @t table (fd int)
declare @fd int
insert into @t select @fd1 union all select @fd2 union all select @fd3
select @fd =max(fd) from @t
return @fd
end
go
DECLARE @tb TABLE([fd1] int, [fd2] int, [fd3] int, [fd4] int, [fd5] int)
INSERT INTO @tb
SELECT 20, 80, 80, 0, 0
UNION ALL SELECT 56, 34, 90, 0, 0
UNION ALL SELECT 55, 35, 100, 0, 0
update @tb set fd4=dbo.f_max(fd1,fd2,fd3)
,fd5=fd1+fd2+fd3-dbo.f_max(fd1,fd2,fd3)
select * from @tbdrop function dbo.f_max
fd1 fd2 fd3 fd4 fd5
----------- ----------- ----------- ----------- -----------
20 80 80 80 100
56 34 90 90 90
55 35 100 100 90
假设是有多字段的 到fd1fd10的话 用case就不行了
还有没有其他的方法呢
INSERT INTO # SELECT 56 , 34 , 90
INSERT INTO # SELECT 55 , 35 , 100 SELECT *,
CASE
WHEN fd3>=fd2 AND fd3>=fd1 THEN fd3
WHEN fd2>=fd1 THEN fd2
ELSE fd1
END ,
CASE
WHEN fd3>=fd2 AND fd3>=fd1 THEN fd1+fd2
WHEN fd2>=fd1 THEN fd1+fd3
ELSE fd2+fd3
END
FROM #20 80 80 80 100
56 34 90 90 90
55 35 100 100 90