Sql 选择查询以查找差异
我对sql相当陌生。我的问题是如何按字段分组,然后确定列中值之间的差异。比如说 索赔额Sql 选择查询以查找差异,sql,Sql,我对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 我需要
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将被忽略您可以使用group by和sum来查找特定索赔的总值。 除非使用插入/默认顺序,否则无法查找差异,除非指定第一个索赔金额。 若我们知道哪一个是第一个,我们可以用其他的数减去 如果每个索赔只有两个条目,则可以得到第一个条目和最后一个条目之间的绝对差异 您还可以根据插入顺序获得非绝对差异:
select claim, (last(amount) - first(amount)) from claims group by claim;
使现代化
由于许多数据库不支持first和last,以下是备选方案:
MySQL
SQLFiddle:
MS SQL
对于MS SQL,由于从一个集合中获取底部的X条记录非常困难,因此我使用了平均值函数:
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 Fiddle:每个索赔编号是否总是正好有2行?您正在使用什么RDBMS?第一个和最后一个是如何定义的?表中是否存在值为1、2、3、…8的列?如果是这样的话,它的名字是什么?你使用的是哪种RDBMS?@Christopher Robinson我提供了一个更新的答案,它使用MS SQl和MYSQL的默认顺序生成结果。不,每个声明可以有很多行;我正在使用access;第一个和最后一个没有定义;不只是行号;我尝试过嵌套查询,但不知道如何按索赔编号分组;我将尝试发布我已经尝试过的东西;等等…哪个RDBMS支持第一个和最后一个?这些不是必须是窗口函数吗?如果您选中,您将在SQL聚合函数部分看到它们。不幸的是,尽管我知道access支持它,这就是为什么我一直在用其他数据库的例子更新答案。。。但不幸的是,限制或获取顶部/底部的特定功能是特定于供应商的,因此语法会发生变化。@Jack Maney竭尽全力为两种最流行的DBs提供解决方案。。。尤其是数据缺少一个键。
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;