来自另一个表的不同列的sql update表

时间:2010-11-14 09:17:01

标签: sql

我有两张桌子:

表1

S/N  OnId    FromDate      ToDate      Value  
aaa   1     2010-10-09    2010-10-15     ?  
aaa   2     2010-10-10    2010-10-29     ?  
bbb   1     2010-10-16    2010-10-20     ?  

表2

Id     Date          Count  
1     2010-10-03     100  
2     2010-10-03     150  
1     2010-10-08     200  
2     2010-10-12     250  
1     2010-10-13     300  
1     2010-10-14     400  
2     2010-10-17     450  
1     2010-10-20     500  

我需要从Table2中找到最新的Count,其中Id和日期小于FromDate(称之为' FromCount'),最近的Count具有相同的Id和日期小于ToDate(称之为“ToCount'”),并更新Table1中的Value列及其差异。所以中间计算看起来像这样:

S/N  OnId    FromDate      ToDate      FromCount  ToCount
aaa   1     2010-10-09    2010-10-15      200       400   
aaa   2     2010-10-10    2010-10-29      150       450  
bbb   1     2010-10-16    2010-10-20      400       500    

在UPDATE之后,Table1看起来像这样:

表1

S/N  OnId    FromDate      ToDate      Value  
aaa   1     2010-10-09    2010-10-15     200 (400-200)   
aaa   2     2010-10-10    2010-10-29     300 (450-150)  
bbb   1     2010-10-16    2010-10-20     100 (500-400)    

之后我将需要总结相同S / N的所有值:

表3

S/N    Total
aaa     500
bbb     100

我使用sql server 2005并希望使用sql成功并且不需要全部写入 这在我的应用程序中用c#:)

感谢!!!

2 个答案:

答案 0 :(得分:1)

您需要两个correlated subqueries

这是一个带有一个子查询的查询:

SELECT t1.SN, t1.OnId, t1.FromDate, t1.ToDate,
      (SELECT TOP 1 Count
       FROM table2 t2To
       WHERE t2To.Id = t1.OnId AND t2To.Date <= t1.ToDate
       ORDER BY t2To.Date DESC)
FROM table1 t1

这给你这个:

aaa         1   2010-10-09    2010-10-15    400  
aaa         2   2010-10-10    2010-10-29    450  
bbb         1   2010-10-16    2010-10-20    500  

您需要添加另一个,然后将其转换为UPDATE查询:

UPDATE table1
SET Value = 
   (SELECT ...) - (SELECT ...)

答案 1 :(得分:1)

这有效:

 UPDATE table1  
 SET Value =   
 (
    isnull( 
       (SELECT TOP 1 Count 
        FROM table2 t2To 
        WHERE t2To.Id = t1.OnId AND t2To.Date <= t1.ToDate 
        ORDER BY t2To.Date DESC) 
    ,0.0)
 )-(
    isnull(
       (SELECT TOP 1 Count 
        FROM table2 t2To 
        WHERE t2To.Id = t1.OnId AND t2To.Date <= t1.FromDate 
        ORDER BY t2To.Date DESC) 
    ,0.0)
 )

谢谢!