我有一张表MOUVEMENTS,它有3列:
ID IDREF NUMBER
1 1 5
2 1 3
3 1 4
4 1 2
5 2 1
我想用这些约束来获取这个表的行:
我想我们将首先计算SUM。然后我们将限制该列
ID IDREF NUMBER SUM
1 1 5 5
2 1 3 8
3 1 4 12
4 1 2 2
5 2 1 1
在这种情况下,如果我们想要11,我们将取两个第一列+第三列,我们将更改数字以具有相干值。
等待结果:
ID IDREF NUMBER SUM
1 1 5 5
2 1 3 8
3 1 3 11
请注意NUMBER和SUM列第三行的更改。
你知道如何实现这个目标吗?
此查询应该从sql 2000到2008 R2
答案 0 :(得分:1)
我在这里创建了一个使用视图的解决方案:http://www.sqlfiddle.com/#!3/ebb01/15
该视图包含每个IDRef的运行总计列:
CREATE VIEW MouvementsRunningTotals
AS
SELECT
A.ID,
A.IDRef,
MAX(A.Number) Number,
SUM (B.Number) RunningTotal
FROM
Mouvements A
LEFT JOIN Mouvements B ON A.ID >= B.ID AND A.IDRef = B.IDRef
GROUP BY
A.ID,
A.IDRef
如果无法创建视图,则可以将其创建为tsql中的临时表。
然后查询是该视图上的自联接,以便根据您传入的数字确定哪个是要包含的最后一行。然后CASE
语句确保最后一行的正确值:
DECLARE @total int
DECLARE @idRef int
SELECT @total = 4
SELECT @idRef = 1
SELECT
A.ID,
A.IDRef,
CASE
WHEN A.RunningTotal <= @total THEN A.Number
ELSE @total - B.RunningTotal
END Number
FROM
MouvementsRunningTotals A
LEFT JOIN MouvementsRunningTotals B ON
A.IDRef = B.IDRef
AND A.RunningTotal - A.Number = B.RunningTotal
WHERE
A.IDRef = @IDRef
AND (A.RunningTotal <= @total
OR (A.RunningTotal > @total AND B.RunningTotal < @total))
您可以在Build Schema框中添加更多数据,并更改Query框中@total参数中的Number以对其进行测试。
答案 1 :(得分:0)
select id, (select top 1 number from mouvements) as number, idref
from mouvements where idref=1 order by id asc