1

我有一个表 MOUVEMENTS 有 3 列:

ID     IDREF     NUMBER
1      1         5
2      1         3
3      1         4
4      1         2
5      2         1

我想使用该约束获取该表的行:

  • IDREF = 1
  • 由 ID ASC 订购
  • 以及 NUMBER 的 X 第一个 SUM(通过 IDREF)

我想我们将首先计算 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

4

2 回答 2

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 中将其创建为临时表。

然后查询是对该视图的自联接,以便根据您传入的 Number 确定要包含的最后一行。然后一条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 以对其进行测试。

于 2013-02-11T12:01:02.580 回答
0
select id, (select top 1 number from mouvements) as number, idref 
from mouvements where idref=1 order by id asc
于 2013-02-11T10:18:11.127 回答