求和一列并获取Transact Sql中的第一行

时间:2013-02-11 09:58:08

标签: sql sql-server tsql

我有一张表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的第一个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

2 个答案:

答案 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