合并问题,再次请教各位:)
上一类似帖已结,现想要的结果有些变动,再次请教大家:)
如下数据:
kid      lid      f3       f4        f5       f6  
1        2        a        NULL      NULL     NULL
1        2        NULL     e         NULL     NULL
1        2        b        NULL      NULL     e
1        2        q        b         NULL     j
2        9        u        x         n        b  
1        3        k        f         d        c
现要将kid和lid均相同的行进行合并
合并后的数据为:  
kid      lid      f3       f4        f5       f6  
1        2        a        e         NULL     e   
2        9        u        x         n        b  
1        3        k        f         d        c
亦即是kid,lid相同的,最靠前的一行的某一字段,
         如果不为空,则保留该值;
        如果为空,则有两种取值:一是都为空,则取值NULL;二是不全为空,则取最靠近的行且不为空的值.
------解决方案--------------------create table A(kid int,lid int,f3 varchar(10),f4 varchar(10),f5 varchar(10),f6 varchar(10))  
insert into A values(1,2, 'a' ,NULL, NULL,NULL )  
insert into A values(1,2, NULL, 'e' , NULL,NULL )  
insert into A values(1,2, 'b' , NULL ,NULL,'e') 
insert into A values(1,2, 'q' , 'b' ,NULL, 'j' )  
insert into A values(2,9, 'u' , 'x' ,'n', 'b' )
insert into A values(1,3, 'k' , 'f' , 'd','c')  
go  
select identity(int,1,1) as id,* into #T from A
select distinct  
   a.kid,a.lid,  
   f3=(select top 1 f3 from #T where kid=a.kid and lid=a.lid and f3 is not null order by id),  
   f4=(select top 1 f4 from #T where kid=a.kid and lid=a.lid and f4 is not null order by id),  
   f5=(select top 1 f5 from #T where kid=a.kid and lid=a.lid and f5 is not null order by id),
   f6=(select top 1 f6 from #T where kid=a.kid and lid=a.lid and f6 is not null order by id) 
from  
   #T a  
go  
drop table A,#T
------解决方案--------------------create table test(kid int,lid int,f3 varchar(8),f4 varchar(8),f5 varchar(8),f6 varchar(8))  
insert into test values(1,2,'a' ,NULL,NULL,NULL)  
insert into test values(1,2,NULL,'e' ,NULL,NULL)  
insert into test values(1,2,'b' ,NULL,NULL,'e' )
insert into test values(1,2,'q' ,'b' ,NULL,'j' ) 
insert into test values(2,9,'u' ,'x' ,'n' ,'b' )  
insert into test values(1,3,'k' ,'f' ,'d' ,'c' )  
go  
select identity(int,1,1) as id,* into # from test  
select distinct  
   t.kid,t.lid,  
   f3=(select top 1 f3 from # where kid=t.kid and lid=t.lid and f3 is not null order by id),  
   f4=(select top 1 f4 from # where kid=t.kid and lid=t.lid and f4 is not null order by id),  
   f5=(select top 1 f5 from # where kid=t.kid and lid=t.lid and f5 is not null order by id),
   f6=(select top 1 f6 from # where kid=t.kid and lid=t.lid and f6 is not null order by id)
from  
   # t  
go  
/*  
kid         lid         f3       f4       f5       f6      
----------- ----------- -------- -------- -------- --------  
1           2           a        e        NULL     e
1           3           k        f        d        c
2           9           u        x        n        b
*/  
drop table test,#  
go
------解决方案--------------------create table tb(kid int,lid int,f3 varchar(10),f4 varchar(10),f5 varchar(10),f6 varchar(10))
insert into tb values(1 ,       2 ,       'a' ,       NULL ,     NULL,     NULL)  
insert into tb values(1 ,       2 ,       NULL,       'e'  ,     NULL,     NULL)  
insert into tb values(1 ,       2 ,       'b' ,       NULL ,     NULL,     'e')