重复信息中case when exists 的应用...
重复信息中case when exists 的应用
create table #a(Fname varchar(30),fqun decimal(18,2),fclass int )
create table #b ( fclass int,name varchar(30))
insert into #a
select 'a',20,1
union all
select 'a',20,2
union all
select 'a',20,3
union all
select 'B',10,1
union all
select 'B',10,2
insert into #b
select 1,'A'
union
select 2,'B'
union
select 3,'C'
select a.*,b.name from #a a inner join #b b on a.fclass = b.fclass
要求输出格式为
Fname fqun fclass name
------------------------------ -------------------- ----------- ------------------------------
a 20.00 1 A
2 B
3 C
B 10.00 1 A
2 B
-解决-
create table #a(Fname varchar(30),fqun decimal(18,2),fclass int )
create table #b ( fclass int,name varchar(30))
insert into #a
select 'a',20,1
union all
select 'a',20,2
union all
select 'a',20,3
union all
select 'B',10,1
union all
select 'B',10,2
insert into #b
select 1,'A'
union
select 2,'B'
union
select 3,'C'
---select a.*,b.name from #a a inner join #b b on a.fclass = b.fclass
select Fnane=(case when exists (select 1 from #a where a.fname = fname and fclass<a.fclass) then '' else a.fname end)
,fqun=(case when exists (select 1 from #a where a.fqun = fqun and fclass<a.fclass) then '' else ltrim(a.fqun) end)
,a.fclass
,b.name
from #a a
inner join #b b
on a.fclass =b.fclass
order by a.Fname,a.fclass
drop table #a,#b
--------------------------
a 20.00 1 A
2 B
3 C
B 10.00 1 A
2 B
这里需要注意的就是case when exists(select 1 from #a …..
这里的是一个嵌套查询,需要处理的字段里层与外层sql 相等,然后再加一条件,不处理的条件做大小比较。根据 大于 或 小于 可以控制为相同记录的第一条记录,或最后一条记录
如果外层 小于 里层,就是第一条,反之,就是最后一条。
例子:
declare @t table(F1 varchar(8),F2 varchar(8))
insert into @t values('01','a ')
insert into @t values('01','aa ')
insert into @t values('02','b ')
insert into @t values('02','bb ')
insert into @t values('02','bbb')
--select * from @t
select F1=(Case when exists (select 1 from @t where F1=a.F1 and F2<a.F2) then '' else F1 end)
,a.F2
from @t a
order by a..F1,a.F2
--Result--
------------
01 a
aa
02 b
bb
bbb