-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

我想要的是查询还返回一个名为(差异)的附加字段,其中包含同一用户和作业的连续条目中的金额之间的差异。因此,我希望返回的数据如下:

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

在前四行中,Diff 与 Amount 相同,因为每行都是每个用户每个作业的第一个条目(因此,差异是参考有效的 nil 起始 Amount 计算的)。

最后两行包含先前出现在表中的用户和作业组合的信息,因此 Diff 计算如下:

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

我以前从来没有在 SQL 查询中比较过这样的行中的数据,所以我真的不知道从哪里开始。任何帮助将非常感激。

添加

请注意,金额不是运行总计。它是定期对用户在每个特定工作中输入的价值进行的主观评估。实际上,金额可能会从一个评估下降到下一个评估。我想要的是一个返回连续评估“金额”之间差异的查询。

替代解释

我希望返回评估金额的历史变动轨迹。另一个例子,查看单个 Job 和 User 如下:

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