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

大家來幫小弟我看下這個SQL如何寫?

2012-02-07 
大家來幫我看下這個SQL怎么寫???IFEXISTS(SELECT1FROMSYSOBJECTSWHEREXTYPE UANDNAME T )DROPTABLETCREA

大家來幫我看下這個SQL怎么寫???
IF   EXISTS(SELECT   1   FROM   SYSOBJECTS   WHERE   XTYPE= 'U '   AND   NAME= 'T ')
DROP   TABLE   T

CREATE   TABLE   T
(
ITEM_CODE   VARCHAR(20),
PRICE   NUMERIC(10,2),
DATE1   VARCHAR(10)
)

INSERT   INTO   T
SELECT   '1001 ',2.3, '2007-07-06 '   UNION   ALL
SELECT   '1001 ',1.1, '2007-05-02 '   UNION   ALL
SELECT   '1002 ',3.6, '2007-07-07 '   UNION   ALL
SELECT   '1003 ',1.5, '2007-07-13 '   UNION   ALL
SELECT   '1003 ',1.5, '2007-06-01 '   UNION   ALL  
SELECT   '1003 ',1.5, '2007-06-01 '   UNION   ALL  
SELECT   '1003 ',1.5, '2007-05-08 '   UNION   ALL
SELECT   '1004 ',2.5, '2007-06-30 '   UNION   ALL
SELECT   '1004 ',2.5, '2007-06-30 '   UNION   ALL
SELECT   '1004 ',3.6, '2007-07-01 '   UNION   ALL
SELECT   '1004 ',3.0, '2007-05-01 '

我想得到以下結果:
ITEM_CODE       LAST_DATE     LAST_PRICE     PRIOR_DATE   PRIOR_PRICE     相差
1001                 2007-07-06           2.3           2007-05-02       1.1                   1.2
1002                 2007-07-07           3.6           2007-07-07       3.6                     0
1003                 2007-07-13           1.5           2007-06-01       1.5                     0
1004                 2007-07-01           3.6           2007-06-30       2.5                   1.1    

註:
通過結果,大家都看出來了,last_date   是每個料號的最大日期,prior_price   是第二大日期  
如果   只有一條記錄如1002   prior_date   就取最大日期
如果有多條相同的記錄如   1003,1004,我在這里只列了三個字段,其實在表中還有好多不同字段,所以
不能用distinct去重復,對於這樣的記錄,隨便取一條好了

這個表比較大,我自己寫了個,總覺得效果不太好,不知大家有什么好的寫法
謝謝!




[解决办法]
IF EXISTS(SELECT 1 FROM SYSOBJECTS WHERE XTYPE= 'U ' AND NAME= 'T ')
DROP TABLE T

CREATE TABLE T
(
ITEM_CODE VARCHAR(20),
PRICE NUMERIC(10,2),
DATE1 VARCHAR(10)
)

INSERT INTO T
SELECT '1001 ',2.3, '2007-07-06 ' UNION ALL
SELECT '1001 ',1.1, '2007-05-02 ' UNION ALL
SELECT '1002 ',3.6, '2007-07-07 ' UNION ALL
SELECT '1003 ',1.5, '2007-07-13 ' UNION ALL
SELECT '1003 ',1.5, '2007-06-01 ' UNION ALL
SELECT '1003 ',1.5, '2007-06-01 ' UNION ALL
SELECT '1003 ',1.5, '2007-05-08 ' UNION ALL
SELECT '1004 ',2.5, '2007-06-30 ' UNION ALL
SELECT '1004 ',2.5, '2007-06-30 ' UNION ALL
SELECT '1004 ',3.6, '2007-07-01 ' UNION ALL


SELECT '1004 ',3.0, '2007-05-01 '
GO
Select
Distinct
A.ITEM_CODE,
A.DATE1 As LAST_DATE,
A.PRICE As LAST_PRICE,
IsNull(C.DATE1, A.DATE1) As PRIOR_DATE,
IsNull(C.PRICE, A.PRICE) As PRIOR_PRICE,
A.PRICE - IsNull(C.PRICE, A.PRICE) As 相差
From
T A
Inner Join
(Select ITEM_CODE, Max(DATE1) As DATE1 From T Group By ITEM_CODE) B
On A.ITEM_CODE = B.ITEM_CODE And A.DATE1 = B.DATE1
Left Join T C
On A.ITEM_CODE = C.ITEM_CODE And C.DATE1 = (Select TOP 1 DATE1 From T Where ITEM_CODE = C.ITEM_CODE And DATE1 < A.DATE1)
Order By A.ITEM_CODE
GO
Drop Table T
--Result
/*
ITEM_CODELAST_DATELAST_PRICEPRIOR_DATEPRIOR_PRICE相差
10012007-07-062.302007-05-021.101.20
10022007-07-073.602007-07-073.60.00
10032007-07-131.502007-06-011.50.00
10042007-07-013.602007-06-302.501.10
*/

热点排行