我是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将被忽略
答案 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;