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

分少,好心的高手们帮忙~该如何解决

2012-03-24 
分少,好心的高手们帮忙~~二张表,分别是Archives,Contract表ArchivesfIDfNO----------------------------00

分少,好心的高手们帮忙~~
二张表,分别是Archives,Contract


表Archives

fID                         fNO
----------------------------
001                       DA00001
002                       DA00002
.........................


表Contract

fArchivesID         fNO                       fDate
----------------------------
001                     GC00001             1900-01-01
001                     AJ00001             2005-05-03
001                     FQ00001             2003-07-08
002                     GC00002             1900-01-01
002                     AJ00002             2007-03-03
002                     FQ00002             1900-01-01
002                     DK00002             2007-06-03
.......................


需要解释一下的是,表Contract的fNO字段的前缀字母部份只有以下几种可能:
GC
AJ
FQ
DK
不会再有其它形式


以上二张表进行关联,得出如下表样式(Archives   left   join   Contract   on   Archives.fID   =   Contract.fArchivesiID   )


a.fID               a.fNO                 GC                                           AJ                                             FQ                                     DK                          
------------------------------------------------------------------------
001                 DA00001       GC00001||1900-01-01       AJ00001||2005-05-03       FQ00001||2003-07-08
002                 DA00002       GC00002||1900-01-01       AJ00002||2007-03-03       FQ00002||1900-01-01         DK00002||2007-06-03
................


问题1:

Select   a.fID,a.fNO,
(Case   When   left(b.fNO,2)   =   'GC '     Then   convert(varchar,b.fNO)   +   '|| '   +   convert(varchar(10),b.fDate,21)   Else   ' '   end   )   GC,
(Case   When   left(b.fNO,2)   =   'AJ '     Then   convert(varchar,b.fNO)   +   '|| '   +   convert(varchar(10),b.fDate,21)   Else   ' '   end   )   AJ,


(Case   When   left(b.fNO,2)   =   'FQ '     Then   convert(varchar,b.fNO)   +   '|| '   +   convert(varchar(10),b.fDate,21)   Else   ' '   end   )   FQ,
(Case   When   left(b.fNO,2)   =   'DK '     Then   convert(varchar,b.fNO)   +   '|| '   +   convert(varchar(10),b.fDate,21)   Else   ' '   end   )   DK
From  
Archives   a   Left   Join   Contract   b   On   a.fID   =   b.fArchivesID     order   by   a.fNO  


我上面的语句,得出部份上面的要求的样式,怎么说呢,看下面的运行结果:

a.fID               a.fNO                 GC                                           AJ                                             FQ                                     DK                          
------------------------------------------------------------------------
001                 DA00001       GC00001||1900-01-01      
001                 DA00001                                                   AJ00001||2005-05-03      
001                 DA00001                                                                                               FQ00001||2003-07-08
002                 DA00002       GC00002||1900-01-01      
002                 DA00002                                                   AJ00002||2007-03-03
002                 DA00002                                                                                               FQ00002||1900-01-01        
002                 DA00002                                                                                                                                             DK00002||2007-06-03



................
也就是每一个DA号实际没有把所有数据集中到一行上,我知道应该用Group   BY能够解决,但是直接用Group   by   a.fNO   却会报出长长一段错误,大意我就不说,大家也会清楚,
我不知道这段应该如何表示了,请好心人帮我完善一下,我也理解清楚到底是什么原因

问题2:
现在需要修改表Contract中的fDate为1900-01-01的值为一个具体的时间值,而这个值的来源是同一个DA号中其它列的日期值,
大家可以再看一下这个表,可以理解我说的意思
a.fID               a.fNO                 GC                                           AJ                                             FQ                                     DK                          
------------------------------------------------------------------------
001                 DA00001       GC00001||1900-01-01       AJ00001||2005-05-03       FQ00001||2003-07-08
002                 DA00002       GC00002||1900-01-01       AJ00002||2007-03-03       FQ00002||1900-01-01         DK00002||2007-06-03
................


修改后的样式:
a.fID               a.fNO                 GC                                           AJ                                             FQ                                     DK                          
------------------------------------------------------------------------
001                 DA00001       GC00001||2005-05-03       AJ00001||2005-05-03       FQ00001||2003-07-08
002                 DA00002       GC00002||2007-03-03       AJ00002||2007-03-03       FQ00002||2007-03-03         DK00002||2007-06-03


以前老也解释不清,语文没学好
但是因为同一个DA号中可能不为1900-01-01的日期可能不会是一个(需要注意的是不见得都是GC列的日期值是1900-01-01,其它列都有可能是1900-01-01),这时就存在一个选
哪一个日期作为更新的标准的问题,原则是:
当GC,AJ,FQ这三列中有一列至少不是1900-01-01时,用这个不是1900-01-01的值去更改其它二个是1900-01-01的值,
当GC,AJ,FQ这三列全是1900-01-01时,而DK不是1900-01-01时,用DK列日期值减一个月作为这三列的值
当GC,AJ,FQ这有至少二列不是1900-01-01时,依照取GC,AJ,FQ这个顺序来取值,比如同时有AJ,FQ值时,取AJ;同时有GC,FQ时取GC....
当这四列全为1900-01-01时,不作修改了
关于这个问题,我也写过一个语句,但还存在问题,拿出来大家指点一下:

Update   a
Set  
        fSaleDate   =  
(Case
  When   left(b.fNO,2)   =   'GC '   AND   b.fDate   <>   '1900-01-01 '   Then   b.fDate
  When   left(b.fNO,2)   =   'AJ '   AND   b.fDate   <>   '1900-01-01 '   Then   b.fDate
  When   left(b.fNO,2)   =   'FQ '   AND   b.fDate   <>   '1900-01-01 '   Then   b.fDate


  When   left(b.fNO,2)   =   'DK '   AND   b.fDate   <>   '1900-01-01 '   Then   b.fDate
  End
)
From  
      Contract   a,
      Contract   b
Where  
      a.fArchivesID   =   b.fArchivesID   AND   a.fDate   =   '1900-01-01 '   AND   b.fDate   <>   '1900-01-01 '


如果可能,大家拿出自已的解决方案,我来学习先进经验~~~



[解决办法]
LZ很努力,我也要向LZ学习
一、嵌套一下
Select fID,fNo,GC=Max(GC),AJ=Max(AJ),FQ=Max(FQ),DK=Max(DK) From (Select a.fID,a.fNO,
(Case When left(b.fNO,2) = 'GC ' Then convert(varchar,b.fNO) + '|| ' + convert(varchar(10),b.fDate,21) Else ' ' end ) GC,
(Case When left(b.fNO,2) = 'AJ ' Then convert(varchar,b.fNO) + '|| ' + convert(varchar(10),b.fDate,21) Else ' ' end ) AJ,
(Case When left(b.fNO,2) = 'FQ ' Then convert(varchar,b.fNO) + '|| ' + convert(varchar(10),b.fDate,21) Else ' ' end ) FQ,
(Case When left(b.fNO,2) = 'DK ' Then convert(varchar,b.fNO) + '|| ' + convert(varchar(10),b.fDate,21) Else ' ' end ) DK
From
Archives a Left Join Contract b On a.fID = b.fArchivesID ) TB Group By fID,fNO
二、没什么问题吧?
再次向lz学习先进经验,呵呵

热点排行