我有两张桌子:
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 ?
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看起来像这样:
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的所有值:
S/N Total
aaa 500
bbb 100
我使用sql server 2005并希望使用sql成功并且不需要全部写入 这在我的应用程序中用c#:)
感谢!!!
答案 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)
)
谢谢!