选择查询以查找差异

时间:2013-06-25 19:49:03

标签: sql

我是sql的新手。我的问题是如何按字段分组,然后确定列中值之间的差异。例如。

索赔#amount

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将被忽略

1 个答案:

答案 0 :(得分: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

MS 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