分少,好心的高手们帮忙~~
二张表,分别是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学习先进经验,呵呵