假设有张表(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..
但是我不知道具体怎么写..有点小菜..呜

解决方案 »

  1.   

    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, 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
      

  2.   

    如果就這麼3列的話,就把情況寫出來好了:
    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
      

  3.   

    update T
    set fd5=fd1+fd2+fd3-fd4
      

  4.   

    update cj
    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
      

  5.   

    --借下測試數據:
    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
    */
      

  6.   

    --定義函數也可以create function f_max(@fd1 int,@fd2 int,@fd3 int)
    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
      

  7.   

    playwarcraft(时间就像乳沟,挤挤还是有的) 的名字有个性呀
    假设是有多字段的   到fd1fd10的话  用case就不行了  
    还有没有其他的方法呢
      

  8.   

    playwarcraft好象第二个方法不错.....我都快忘记了SQL还有个函数..知道自己不止有点菜了
      

  9.   

    是呀 第一种好象字段多的话用case好象也不行   有点难度呀
      

  10.   

    playwarcraft高手....想想办法...西西
      

  11.   

    CREATE TABLE dbo.#(fd1 int, fd2 int, fd3 int)INSERT INTO # SELECT 20  , 80  , 80 
    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