2013-01-17 59 views
-1

这个问题的标题,因为我发现很难简明我想解释什么是可能的措辞不当,除了提供一些演示数据。SQL查询来添加计算字段,比较数据行

我有一个查询,从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是一样的量,因为每个是每个用户的第一个条目每工作(因此的差与计算的参考起始金额零有效)。

最后两行包含一个用户名和作业组合已经出现在该表之前的信息,因此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 

然而,按照最初的例子,将需要从包含大量的就业机会和用户都混一个表中提取此信息。

+0

什么版本的SQL Server吗? – gbn

+0

此外,为什么ID = 5金额850但ID = 6金额650?对于ID 5,您已将以前的101,Pete对的金额相加。但对于ID 6,您有当前的金额。这是每对货品的“第一价值”吗?或每对“以前的价值”? – gbn

+0

缺少日期/时间列,是否由_ID值的顺序来定义_consecutive_? – HABO

回答

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 
+0

这些金额对用户而言并不是工作总额,因此ID 5和6是正确的。还有一个Date字段(和其他字段),但为了保持示例数据简洁,我没有包含它。 – PJW

+0

@PJW:在源数据中更新为850. – gbn

+1

尽管有关算术的所有论点,PARTITION和LAG关键字是我一直在寻找的,并使我能够起草解决方案。 – PJW