-3

我对sql相当陌生。我的问题是如何按字段分组,然后确定列中值之间的差异。例如。

索赔#金额

1. c3101    50000
2. c3101    19000
3. c1307    30000
4. c1307    14000
5. c3104    75000
6. c3104     0
7. c1313    5000
8. c1313   10000

预期成绩

1. c3101    -31000
2. c1307     -26000
3. c1313     5000

我需要找出金额与索赔编号之间的差异。所以对于 c3101,我从 50000 开始到 19000,所以到 19000 的交易将是 -31000。c3104 将被忽略

4

1 回答 1

2

您可以使用 group by 和 sum 来查找特定索赔的总值。除非您指定第一个索赔金额(除非您使用插入/默认顺序),否则无法找到差异。如果我们知道哪个是第一个,我们可以减去其他金额(或金额)。

如果每个声明只有两个条目,您可以获得first()last()条目之间的绝对差异。

select claim, abs(last(amount) - first(amount)) from claims group by claim;

您还可以根据插入顺序获得非绝对差异:

select claim, (last(amount) - first(amount)) from claims group by claim;

更新

由于许多数据库不支持first()并且last()不支持,以下是替代方案:

MySQL

select distinct claim, 
(select amount from claims c1 where c1.claim = c2.claim limit 1,1) -
(select amount from claims c1 where c1.claim = c2.claim limit 0,1) as "Difference"
from claims c2;

SQLFiddle:http ://sqlfiddle.com/#!2/2e62a0/15

微软 SQL

对于 MS SQL,由于很难从集合中获取底部 X 记录,因此我使用了以下average()函数:

   SELECT claim, ((avg(amount)*2) -
                 (SELECT top 1 amount
                  FROM claims c2
                  WHERE c2.claim = c.claim))-
  (SELECT top 1 amount
   FROM claims c2
   WHERE c2.claim = c.claim)
FROM claims c
GROUP BY claim;

进一步简化为:

SELECT claim,
       2* ( avg(amount) -
             (SELECT top 1 amount
              FROM claims c2
              WHERE c2.claim = c.claim))
FROM claims c
GROUP BY claim;

SQL 小提琴:http ://sqlfiddle.com/#!3/2e62a/28

于 2013-06-25T19:55:43.463 回答