name    state
张三     未开始
张三     进行中
张三     未开始
李四     未开始
李四     未开始
王五     已完成
王五     已完成
王五     已完成
用一个包含group by name 的sql 写出如下sql(支持2000)name    state
张三    进行中
李四    未开始
王五    已完成判断逻辑是 全部未开始就是未开始
全部已完成就是已完成
其它任何状态都是进行中。

解决方案 »

  1.   

    --> 测试数据: #tb
    if object_id('tempdb.dbo.#tb') is not null drop table #tb
    go
    create table #tb (name varchar(4),state varchar(6))
    insert into #tb
    select '张三','未开始' union all
    select '张三','进行中' union all
    select '张三','未开始' union all
    select '李四','未开始' union all
    select '李四','未开始' union all
    select '王五','已完成' union all
    select '王五','已完成' union all
    select '王五','已完成'select name ,
    state=case when count(distinct state)>1 then '进行中'
       when max(state)='未开始' then '未开始'
       when max(state)='已完成' then '已完成'
    end
    from #tb
    group by namename state
    ---- ------
    李四   未开始
    王五   已完成
    张三   进行中(3 行受影响)
      

  2.   

    ---测试数据---
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([name] varchar(4),[state] varchar(6))
    insert [tb]
    select '张三','未开始' union all
    select '张三','进行中' union all
    select '张三','未开始' union all
    select '李四','未开始' union all
    select '李四','未开始' union all
    select '王五','已完成' union all
    select '王五','已完成' union all
    select '王五','已完成'
     
    ---查询---
    select name,
    state=
    case 
      when not exists(select 1 from tb where name=t.name and state!='已完成') then '已完成'
      when not exists(select 1 from tb where name=t.name and state!='未开始') then '未开始'
    else '进行中'
    end
    from tb t
    group by name---结果---
    name state
    ---- ------
    李四   未开始
    王五   已完成
    张三   进行中(3 行受影响)