读书人

请问一个sql哈

发布时间: 2012-08-29 08:40:14 作者: rapoo

请教一个sql,高手进哈
有表A
idstation_name
1南京
2镇江
3丹阳
4常州
5无锡
6苏州
7上海
有表B
train_nostation_namenum
G7001南京 287
G7001常州 391
G7001无锡 485
G7001苏州 576
G7001上海 576
G7003南京 342
G7003苏州 407
G7003上海 407
产生表c

idstation_namecodenum
1南京G7001287
2镇江G7001287
3丹阳G70011000
4常州G7001391
5无锡G7001485
6苏州G7001576
7上海G7001576
1南京G7003342
2镇江G7003342
3丹阳G7003342
4常州G7003342
5无锡G7003342
6苏州G7003407
7上海G7003407


[解决办法]
3 丹阳 G7001 1000 这个是怎么来的?
[解决办法]
2镇江G7001287
3丹阳G70011000

2镇江G7003342
3丹阳G7003342

--------------
这是怎么计算出来的
[解决办法]

SQL code
;WITH t1AS(SELECT a.ID,a.train_no,a.station_name,b.numFROM (SELECT a.*,b.train_no FROM A,(SELECT DISTINCT train_no FROM B) AS B) AS aLEFT JOIN B ON a.train_no=b.train_no AND a.station_name=b.station_name)SELECT     a.train_no,a.station_name,ISNULL(a.num,b.num) AS numFROM t1 AS aCROSS APPLY(SELECT TOP 1 num FROM t1 WHERE ID<a.ID AND num IS NOT null ORDER BY ID desc) AS b
[解决办法]
SQL code
--> 测试数据:[ta]IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]GO CREATE TABLE [ta]([id] INT,[station_name] VARCHAR(4))INSERT [ta]SELECT 1,'南京' UNION ALLSELECT 2,'镇江' UNION ALLSELECT 3,'丹阳' UNION ALLSELECT 4,'常州' UNION ALLSELECT 5,'无锡' UNION ALLSELECT 6,'苏州' UNION ALLSELECT 7,'上海'--------------开始查询--------------------------SELECT * FROM [ta]----------------结果----------------------------/* */--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GO CREATE TABLE [tb]([train_no] VARCHAR(5),[station_name] VARCHAR(4),[num] INT)INSERT [tb]SELECT 'G7001','南京',287 UNION ALLSELECT 'G7001','常州',391 UNION ALLSELECT 'G7001','无锡',485 UNION ALLSELECT 'G7001','苏州',576 UNION ALLSELECT 'G7001','上海',576 UNION ALLSELECT 'G7003','南京',342 UNION ALLSELECT 'G7003','苏州',407 UNION ALLSELECT 'G7003','上海',407--------------开始查询--------------------------;WITH  cteAS (     SELECT a.[id], a.[station_name], b.[train_no], c.[num]     FROM   [ta] AS a     CROSS JOIN (                  SELECT DISTINCT                          [train_no]                  FROM    [tb]                ) AS b     OUTER APPLY (                   SELECT [num] FROM tb WHERE [station_name]= a.[station_name] AND [train_no]= b.[train_no]                 ) c   )SELECT [id], [station_name], [train_no], [num] = ISNULL([num], (                                                              SELECT TOP 1 [num] FROM cte WHERE [train_no]= t.[train_no] AND [id]< t.[id]                                                            ))FROM   cte AS tORDER BY t.[train_no], t.[id]/*id          station_name train_no num----------- ------------ -------- -----------1           南京           G7001    2872           镇江           G7001    2873           丹阳           G7001    2874           常州           G7001    3915           无锡           G7001    4856           苏州           G7001    5767           上海           G7001    5761           南京           G7003    3422           镇江           G7003    3423           丹阳           G7003    3424           常州           G7003    3425           无锡           G7003    3426           苏州           G7003    4077           上海           G7003    407(14 行受影响)*/ 

读书人网 >SQL Server

热点推荐