任务表
任务ID  任务审核  A符号  A标准  B符号  B标准  C符号  C标准  D符号  D标准 实际完成
  1                >      10      >      8      >      6      <      6      9
  2                >      20      >      16     >      13     <      13     14
A符号,B符号等等为字符型
A标准,B标准等等为数字型
要求:“实际完成”值先与“A标准”用“A符号”比较,若符合标准:任务审核=A,否则
      “实际完成”值先与“B标准”用“B符号”比较,若符合标准:任务审核=B,以此类推。

解决方案 »

  1.   

    select [任务Id], min([标准]) [任务审核]
    from
    (select [任务Id], 'A' [标准], (case [A符号] when '>' then sign([实际完成] - [A标准]) else sign([A标准] - [实际完成]) end) as rel 
    from [任务表]
    union 
    select [任务Id], 'B', (case [B符号] when '>' then sign([实际完成] - [B标准]) else sign([B标准] - [实际完成]) end)
    from [任务表]
    union 
    select [任务Id], 'C', (case [C符号] when '>' then sign([实际完成] - [C标准]) else sign([C标准] - [实际完成]) end)
    from [任务表]
    union 
    select [任务Id], 'D', (case [D符号] when '>' then sign([实际完成] - [D标准]) else sign([D标准] - [实际完成]) end)
    from [任务表]) X
    where rel = 1
    group by [任务Id]
      

  2.   

    补充:
    create table [任务表](
    [任务Id] [int] IDENTITY(1,1) NOT NULL,
    [A符号] [varchar](10),
    [A标准] [int] NULL,
    [B符号] [varchar](10),
    [B标准] [int] NULL,
    [C符号] [varchar](10),
    [C标准] [int] NULL,
    [D符号] [varchar](10),
    [D标准] [int] NULL,
    [实际完成] [int] NULL,
     CONSTRAINT [PK_renwub] PRIMARY KEY ([任务Id]))
    gotruncate table [任务表]
    goinsert into [任务表]([A符号], [A标准], [B符号], [B标准], [C符号], [C标准], [D符号], [D标准], [实际完成])
    values('>', 10, '>', 8, '>', 6, '<', 6, 9)
    goinsert into [任务表]([A符号], [A标准], [B符号], [B标准], [C符号], [C标准], [D符号], [D标准], [实际完成])
    values('>', 20, '>', 16, '>', 13, '<', 13, 14)
    go
      

  3.   

    wenyzh(Alex)兄:
         min([标准])和'A'[标准] 中的[标准]指的是那个标准啊
      

  4.   

    create table [任务表](
    [任务Id] [int] IDENTITY(1,1) NOT NULL,
    [任务审核] varchar(10),
    [A符号] [varchar](10),
    [A标准] [int] NULL,
    [B符号] [varchar](10),
    [B标准] [int] NULL,
    [C符号] [varchar](10),
    [C标准] [int] NULL,
    [D符号] [varchar](10),
    [D标准] [int] NULL,
    [实际完成] [int] NULL,
     CONSTRAINT [PK_renwub] PRIMARY KEY ([任务Id]))
    goinsert into [任务表]([A符号], [A标准], [B符号], [B标准], [C符号], [C标准], [D符号], [D标准], [实际完成])
    values('>', 10, '>', 8, '>', 6, '<', 6, 9)insert into [任务表]([A符号], [A标准], [B符号], [B标准], [C符号], [C标准], [D符号], [D标准], [实际完成])
    values('>', 20, '>', 16, '>', 13, '<', 13, 14)
    goDECLARE tb CURSOR GLOBAL
    FOR
    SELECT 'UPDATE 任务表 SET 任务审核 = CASE '
    + ' WHEN ' + RTRIM(实际完成) + ' ' + RTRIM(A符号) + ' ' + RTRIM(A标准) + ' THEN ''A'''
    + ' WHEN ' + RTRIM(实际完成) + ' ' + RTRIM(B符号) + ' ' + RTRIM(B标准) + ' THEN ''B'''
    + ' WHEN ' + RTRIM(实际完成) + ' ' + RTRIM(C符号) + ' ' + RTRIM(C标准) + ' THEN ''C'''
    + ' WHEN ' + RTRIM(实际完成) + ' ' + RTRIM(D符号) + ' ' + RTRIM(D标准) + ' THEN ''D'''
    + ' END'
    + ' WHERE CURRENT OF tb'
    FROM 任务表
    OPEN tb
    DECLARE @s nvarchar(4000)
    FETCH tb INTO @s
    WHILE @@FETCH_STATUS = 0
    BEGIN
    EXEC(@s)
    FETCH tb INTO @s
    END
    CLOSE tb
    DEALLOCATE tb
    GOSELECT * FROM 任务表
    GODROP TABLE  任务表
      

  5.   

    -- 结果:任务Id 任务审核 A符号 A标准 B符号 B标准 C符号 C标准 D符号 D标准 实际完成
    1 B > 10 > 8 > 6 < 6 9
    2 C > 20 > 16 > 13 < 13 14
      

  6.   

    谢谢,wenyzh(Alex)兄和邹老大,辛苦,马上结帖....
      

  7.   

    to lz:
    min(标准), 是指from后面的View中的[标准]列,view中对每个[任务Id]共有4行,分别是'A',
     'B', 'C', 'D'
    如果你要做update,想必对你来说已经很容易了
      

  8.   

    还有,邹老大,我觉得用游标更新不如直接写update语句效率高,虽然实现的结果是一样的。
    如果任务ID很多的话,用游标效率就更差。
    update 表和视图的关联条件当然是任务Id相等。