昨天早发了类似个帖子,后来下午又发了一个类似的帖子,在后来回去自己测试,发现还是有问题,
是在太笨了,我已经自己尝试调试了一整天,最后无奈还是上来求救了,问题如下。
表a:usera
字段:ida,namea   
值:
1 jack
2 rose
3 sam
4 bill表b:recordb /////字段改成了status1和status2,
字段:idb,status1,status2  
值:
1 jack,rose,sam, jack,rose,
2 jack, null
3 jack, null                    
4 null null
//这里比之前的帖子多了一条记录。即2,3记录是相同的。
问题:希望能有个集合,在表a的基础上,在最后增加三列分别是cnt1,cnt2,cntall
cnt1用来计算表a的名字在表b的status1这列记录出现的记录数
cnt2同理
cntall 用来判断,如果cnt1>0,取cnt1的值,如果没有才取cnt2的值(当然cnt>0),否则就=0
结果c:
ida,namea,cnt1,cnt2,cntall
1 jack 3 1 3
2 rose 1 1 1
3 sam 1 0 1
4 bill 0 0 0国际惯例,我又一次感谢高人,热心人和路人甲乙丙丁戊己庚辛壬癸

解决方案 »

  1.   

    原来的帖子因为自己举例不完整,结果导致解答无法正确统计具有相同status1的数量。
      

  2.   

    idb不会有重复的吧,如果它不重复的话替换一下就可以了
      

  3.   

    if object_id('[usera]') is not null drop table [usera]
    go
    create table [usera]([ida] int,[namea] varchar(4))
    insert [usera]
    select 1,'jack' union all
    select 2,'rose' union all
    select 3,'sam' union all
    select 4,'bill'
    if object_id('[recordb]') is not null drop table [recordb]
    go
    create table [recordb]([idb] int,[status1] varchar(13),[status2] varchar(10))
    insert [recordb]
    select 1,'jack,rose,sam','jack,rose,' union all
    select 2,'jack',null union all
    select 3,'jack',null union all
    select 4,null,null
     
    select *,cntall=case when cnt1>0 then cnt1 else cnt2 end
    from
    (
    select a.*,
    cnt1=count(distinct b.idb),
    cnt2=count(distinct c.idb)
    from usera a
    left join recordb b
    on charindex(','+a.namea+',' ,','+b.status1+',')>0 
    left join recordb c
    on charindex(','+a.namea+',' ,','+c.status2+',')>0
    group by a.ida,a.namea
    ) t
    order by ida/**
    ida         namea cnt1        cnt2        cntall      
    ----------- ----- ----------- ----------- ----------- 
    1           jack  3           1           3
    2           rose  1           1           1
    3           sam   1           0           1
    4           bill  0           0           0(所影响的行数为 4 行)
    **/