首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

怎么使用sql语句查找上下条符合实际需求的数据

2013-10-31 
如何使用sql语句查找上下条符合实际需求的数据最近做一个程序,需要上下查找需要满足条件的信息,数据如下:

如何使用sql语句查找上下条符合实际需求的数据
最近做一个程序,需要上下查找需要满足条件的信息,数据如下:
其中TA001为单别,TA002为单号,TA003为加工顺序,TA004为工艺编号,TA006为车间编号,TA007为车间名称,TA031为完工日期,UDF05为是否为关键工艺



根据需要完成8月的查询结果如下:
TA001TA002TA003TA004TA006TA007TA031UDF05
5111307160303207610车间二20130826Y
5111307160304107610车间二        
5111307160304201910车间二        
5111307160304304410车间二        
5111307160304405310车间二20130826Y
5111307160304501513车间三20130828Y
5111307160305101513车间三        
51113071603051515413车间三20130831Y
5111307160313207610车间二20130807Y
5111307170001801213车间三        
5111307170001901313车间三20130823Y
51113071700011001513车间三

在此,对您的帮助表示深深的感谢!!!






[解决办法]

create table cl
(TA001 int, TA002 int,TA003 int,TA004 int,TA006 int,TA007  varchar(10),
 TA031 varchar(8),UDF05 varchar(2))
 
insert into cl
 select 511,1307160303,10,1,11,'车间一','20130722','Y' union all
 select 511,1307160303,20,76,10,'车间二','20130826','Y' union all
 select 511,1307160304,10,76,10,'车间二','','' union all
 select 511,1307160304,20,19,10,'车间二', '', '' union all
 select 511,1307160304,30,44,10,'车间二','','' union all
 select 511,1307160304,40,53,10,'车间二','20130826','Y' union all
 select 511,1307160304,50,15,13,'车间三','20130828','Y' union all
 select 511,1307160305,10,15,13,'车间三','','' union all               
 select 511,1307160305,15,154,13,'车间三','20130831','Y' union all
 select 511,1307160311,10,1,11,'车间一','20130724','Y' union all
 select 511,1307160313,10,1,11,'车间一','20130717','Y' union all
 select 511,1307160313,20,76,10,'车间二','20130807','Y' union all
 select 511,1307170001,80,12,13,'车间三','','' union all               
 select 511,1307170001,90,13,13,'车间三','20130823','Y' union all
 select 511,1307170001,100,15,13,'车间三','',''    union all   
 select 511,1307170002,10,1,11,'车间一','20130922','Y'
 

-- 更新
update a
 set a.TA031=case when d.TA031 is not null then d.TA031
                  else '' end
 from cl a
 inner join
 (select TA001,TA002,TA006,max(TA003) 'maxTA003'
  from cl
  group by TA001,TA002,TA006) b on a.TA001=b.TA001 and a.TA002=b.TA002 and a.TA006=b.TA006
 outer apply
 (select c.TA031 from cl c
   where c.TA001=a.TA001 and c.TA002=a.TA002 and c.TA006=a.TA006 


   and c.UDF05='Y' and 
   (c.TA003=b.maxTA003
    or
    c.TA003 in(a.TA003+10,a.TA003-10))) d
 where a.TA031=''


-- 结果
select * from cl
 
/*
TA001       TA002       TA003       TA004       TA006       TA007      TA031    UDF05
----------- ----------- ----------- ----------- ----------- ---------- -------- -----
511         1307160303  10          1           11          车间一        20130722 Y
511         1307160303  20          76          10          车间二        20130826 Y
511         1307160304  10          76          10          车间二        20130826 
511         1307160304  20          19          10          车间二        20130826 
511         1307160304  30          44          10          车间二        20130826 
511         1307160304  40          53          10          车间二        20130826 Y
511         1307160304  50          15          13          车间三        20130828 Y
511         1307160305  10          15          13          车间三        20130831 
511         1307160305  15          154         13          车间三        20130831 Y
511         1307160311  10          1           11          车间一        20130724 Y
511         1307160313  10          1           11          车间一        20130717 Y
511         1307160313  20          76          10          车间二        20130807 Y
511         1307170001  80          12          13          车间三        20130823 
511         1307170001  90          13          13          车间三        20130823 Y
511         1307170001  100         15          13          车间三        20130823 
511         1307170002  10          1           11          车间一        20130922 Y



(16 row(s) affected)
*/


[解决办法]
是这个不,生成了一个temp_ta031列,用来过滤8月份的数据:


if object_id('cl') is not null
   drop table cl
go

create table cl
(TA001 int, TA002 int,TA003 int,TA004 int,TA006 int,TA007  varchar(10),
 TA031 varchar(8),UDF05 varchar(2))
 
insert into cl
 select 511,1307160303,10,1,11,'车间一','20130722','Y' union all
 select 511,1307160303,20,76,10,'车间二','20130826','Y' union all
 select 511,1307160304,10,76,10,'车间二','','' union all
 select 511,1307160304,20,19,10,'车间二', '', '' union all
 select 511,1307160304,30,44,10,'车间二','','' union all
 select 511,1307160304,40,53,10,'车间二','20130826','Y' union all
 select 511,1307160304,50,15,13,'车间三','20130828','Y' union all
 select 511,1307160305,10,15,13,'车间三','','' union all               
 select 511,1307160305,15,154,13,'车间三','20130831','Y' union all
 select 511,1307160311,10,1,11,'车间一','20130724','Y' union all
 select 511,1307160313,10,1,11,'车间一','20130717','Y' union all
 select 511,1307160313,20,76,10,'车间二','20130807','Y' union all
 select 511,1307170001,80,12,13,'车间三','','' union all               
 select 511,1307170001,90,13,13,'车间三','20130823','Y' union all
 select 511,1307170001,100,15,13,'车间三','',''    union all   
 select 511,1307170002,10,1,11,'车间一','20130922','Y'
 

;with t
as
(
select *,
       row_number() over(partition by ta001,ta002 
                             order by @@servername) as rownum
from cl
),

tt
as
(
select t1.*,
       (select top 1 ta031 from t t2
        where t2.ta001 = t1.ta001
              and t2.ta002 = t1.ta002
              and t2.rownum > t1.rownum
              and t2.ta031 <> ''
              and t1.ta031 = ''
              and t2.udf05 = 'Y'
        order by t2.rownum asc) as next_row,
        
       (select top 1 ta031 from t t2
        where t2.ta001 = t1.ta001
              and t2.ta002 = t1.ta002
              and t2.rownum < t1.rownum
              and t2.ta031 <> ''
              and t1.ta031 = ''
              and t2.udf05 = 'Y'
        order by t2.rownum desc) as prior_row  
        
from t t1
)

select ta001,ta002,
   ta003,ta004,ta006,ta007,
   ta031,udf05,
   temp_ta031 as 补全的ta031
from 
(
select ta001,ta002,
       ta003,ta004,ta006,ta007,
       ta031,udf05,
       
       case when ta031 = ''
                 then isnull(next_row,prior_row)
            else ta031
       end as temp_ta031   --已经补全,作为过滤条件
from tt
)cl
where cl.temp_ta031 >='2013-08-01' and
      cl.temp_ta031 < '2013-09-01'
/*
ta001       ta002       ta003       ta004       ta006       ta007      ta031    udf05 补全的ta031
----------- ----------- ----------- ----------- ----------- ---------- -------- ----- --------


511         1307160303  20          76          10          车间二        20130826 Y     20130826
511         1307160304  10          76          10          车间二                       20130826
511         1307160304  20          19          10          车间二                       20130826
511         1307160304  30          44          10          车间二                       20130826
511         1307160304  40          53          10          车间二        20130826 Y     20130826
511         1307160304  50          15          13          车间三        20130828 Y     20130828
511         1307160305  10          15          13          车间三                       20130831
511         1307160305  15          154         13          车间三        20130831 Y     20130831
511         1307160313  20          76          10          车间二        20130807 Y     20130807
511         1307170001  80          12          13          车间三                       20130823
511         1307170001  90          13          13          车间三        20130823 Y     20130823
511         1307170001  100         15          13          车间三                       20130823*/

热点排行