昨天早发了类似个帖子,后来下午又发了一个类似的帖子,在后来回去自己测试,发现还是有问题,
是在太笨了,我已经自己尝试调试了一整天,最后无奈还是上来求救了,问题如下。
表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国际惯例,我又一次感谢高人,热心人和路人甲乙丙丁戊己庚辛壬癸
是在太笨了,我已经自己尝试调试了一整天,最后无奈还是上来求救了,问题如下。
表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国际惯例,我又一次感谢高人,热心人和路人甲乙丙丁戊己庚辛壬癸
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 行)
**/