日期:2014-05-17  浏览次数:20531 次

求一SQL,急在线!
字段1,字段2,字段3
A001, 100, Yes
null, null, null
null, null, null
null, null, null
B001, NULL, No
null, null, null
null, null, null
null, null, null
C001, 90 , Yes

改为
字段1,字段2,字段3
A001, 100, Yes
A001, 100, Yes
A001, 100, Yes
A001, 100, Yes
B001, NULL, No
B001, NULL, No
B001, NULL, No
C001, 90 , Yes

将是改NULL补充了它!



------解决方案--------------------
SQL code
--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO 
CREATE TABLE [tb]([字段1] VARCHAR(4),[字段2] INT,[字段3] VARCHAR(3))
INSERT [tb]
SELECT 'A001',100,'Yes' UNION ALL
SELECT NULL,NULL,NULL UNION ALL
SELECT NULL,NULL,NULL UNION ALL
SELECT NULL,NULL,NULL UNION ALL
SELECT 'B001',NULL,'No' UNION ALL
SELECT NULL,NULL,NULL UNION ALL
SELECT NULL,NULL,NULL UNION ALL
SELECT NULL,NULL,NULL UNION ALL
SELECT 'C001',90,'Yes'
--------------开始查询--------------------------
;WITH t AS
(
SELECT *,row=ROW_NUMBER() OVER(ORDER BY GETDATE()) FROM [tb]
)
SELECT 
CASE WHEN [字段1] IS NULL THEN (select TOP 1 [字段1] FROM t WHERE row<=a.row AND [字段1] IS NOT NULL ORDER BY row DESC) ELSE [字段1]END, 
CASE WHEN [字段2] IS NULL THEN (select TOP 1 [字段2] FROM t WHERE row<=a.row AND [字段1] IS NOT NULL ORDER BY row DESC) ELSE [字段2]END, 
CASE WHEN [字段3] IS NULL THEN (select TOP 1 [字段3] FROM t WHERE row<=a.row AND [字段1] IS NOT NULL ORDER BY row DESC) ELSE [字段3]END 

FROM t AS a
----------------结果----------------------------
/* 
                 
---- ----------- ----
A001 100         Yes
A001 100         Yes
A001 100         Yes
A001 100         Yes
B001 NULL        No
B001 NULL        No
B001 NULL        No
B001 NULL        No
C001 90          Yes

(9 行受影响)
*/

------解决方案--------------------
SQL code



create table #tt (id int identity(1,1) ,col1 varchar(10) null ,col2 smallint null,col3 varchar(10) null)

insert into #tt(col1,col2,col3)
select 'A001', 100, 'Yes'
union all select null, null, null
union all select null, null, null
union all select null, null, null
union all select 'B001', NULL, 'No'
union all select null, null, null
union all select null, null, null
union all select null, null, null
union all select 'C001', 90 , 'Yes';

update A
set A.col1=T.col1,A.col2=T.col2,A.col3=T.col3
from #tt as A cross apply
(
select top 1 B.col1,B.col2,B.col3
from #tt as B
where B.id<A.id and B.col1 is not null
order by B.id desc
) T
where A.col1 is  null;

select * from #tt order by id;

/*


id          col1       col2   col3
----------- ---------- ------ ----------
1           A001       100    Yes
2           A001       100    Yes
3           A001       100    Yes
4           A001       100    Yes
5           B001       NULL   No
6           B001       NULL   No
7           B001       NULL   No
8           B001       NULL   No
9           C001       90     Yes

(9 row(s) affected)

*/

drop table #tt;

------解决方案--------------------
SQL code


create table #tt (id int identity(1,1) ,col1 varchar(10) null ,col2 smallint null,col3 varchar(10) null)

insert into #tt(col1,col2,col3)
select 'A001', 100, 'Yes'
union all select null, null, null
union all select null, null, null
union all select null, null, null
union all select 'B001', NULL, 'No'
union all select null, null, null
union all select null, null, null
union all select null, null, null
union all select 'C001', 90 , 'Yes';

update A
set A.col1=T.col1,A.col2=T.col2,A.col3=T.col3
from #tt as A cross apply
(
select top 1 B.col1,B.col2,B.col3
from #tt as B
where B.id<A.id and B.col1 is not null
order by B.id desc
) T
where A.col1 is  null;

select * from #tt order by id;

/*


id          col1       col2   col3
----------- ---------- ------ ----------
1           A001       100    Yes
2           A001       1