重复信息中case when exists 的应用...

来源:互联网 发布:js ajax java实例 编辑:程序博客网 时间:2024/04/28 19:01

重复信息中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

原创粉丝点击