-1

この質問の見出しは、デモデータを提供する以外に、私が欲しいものを簡潔に説明するのが難しいと感じているため、おそらく言葉遣いが不十分です.

SQL テーブルから次のデータを返すクエリがあります。

ID    Job    User    Amount

1     101    Bob     100
2     101    Pete    500
3     102    Bob     400
4     102    Pete    200
5     101    Pete    850
6     102    Bob     650

私が望むのは、クエリが (Difference) という追加フィールドも返すことです。これには、同じユーザーとジョブの連続するエントリの金額の違いが含まれます。したがって、返してほしいデータは次のようになります。

ID    Job    User    Amount   Diff

1     101    Bob      100     100
2     101    Pete     500     500
3     102    Bob      400     400
4     102    Pete     200     200
5     101    Pete     850     350
6     102    Bob      650     250

最初の 4 行では、Diff は Amount と同じです。これは、各行が Job ごとの User ごとの最初のエントリであるためです (したがって、差分は有効なゼロの開始 Amount を参照して計算されます)。

最後の 2 行には、前にテーブルに表示されたユーザーとジョブの組み合わせに関する情報が含まれているため、Diff は次のように計算されます。

Job 101    User Pete    850 - 500 = 350
Job 102    User Bob     650 - 400 = 250

これまで SQL クエリでこのような行のデータを比較する必要がなかったので、どこから始めればよいかわかりません。どんな助けでも大歓迎です。

追加した

金額は現在の合計ではないことに注意してください。これは、特定のジョブごとにユーザーが入力した値を定期的に主観的に評価するものです。実際には、ある評価から次の評価に金額が下がる可能性があります。私が欲しいのは、連続する評価「金額」の差を返すクエリです。

代替説明

査定額の動きの履歴証跡を返したいと思っています。したがって、別の例として、単一のジョブとユーザーを見ると、次のようになります。

Job    User    Amount    Movement

101    Bob      100       100
101    Bob      500       400
101    Bob      400      (100)
101    Bob    1,000       600

ただし、元の例のように、この情報は、すべてが混在する多くのジョブとユーザーを含むテーブルから抽出する必要があります。

4

1 に答える 1

3

SQL Server 2012 の場合は、これを試してください

これは、例で ID=5 の値が間違っていることを前提としています

ペアごとの「前回値」について

DECLARE @t TABLE (ID int, Job int, Username varchar(10), Amount int);
INSERT @t
VALUES
    (1, 101, 'Bob', 100), (2, 101, 'Pete', 500), (3, 102, 'Bob', 400),
    (4, 102, 'Pete', 200), (5, 101, 'Pete', 850), (6, 102, 'Bob', 650);

SELECT
    t1.*,
    t1.Amount - ISNULL(LAG(Amount) OVER (PARTITION BY Job, Username ORDER BY ID), 0) AS DiffAmount
FROM
    @t t1
ORDER BY
   t1.ID

ペアごとの「最初の値」について

SELECT
    t1.*,
    CASE
        WHEN FIRST_VALUE(t1.ID) OVER (PARTITION BY Job, Username ORDER BY ID) = t1.ID THEN t1.Amount
        ELSE t1.Amount - FIRST_VALUE(t1.Amount) OVER (PARTITION BY Job, Username ORDER BY ID)
    END AS DiffAmount
FROM
    @t t1
ORDER BY
    t1.ID
于 2013-01-17T15:40:03.427 に答える