1

3列のテーブルMOUVEMENTSがあります。

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

その制約でこのテーブルの行をフェッチしたいと思います:

  • IDREF = 1
  • IDASCで注文
  • およびNUMBERのX個の最初の合計(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が必要な場合は、最初の2つの列と3番目の列を取得し、数値を変更して一貫性のある値にします。

だから結果が待っていた:

ID     IDREF     NUMBER   SUM
1      1         5        5
2      1         3        8
3      1         3        11

NUMBERおよびSUM列の3行目の変更に注意してください。

あなたはそれを達成する方法を知っていますか?

このクエリは、SQL2000から2008R2で機能するはずです。

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 の一時テーブルとして作成できます。

次に、クエリはそのビューの自己結合であり、渡した数値に基づいて含める最後の行を決定します。次に、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))

[ビルド スキーマ] ボックスにデータを追加し、[クエリ] ボックスの @total パラメーターの数値を変更してテストできます。

于 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 に答える