首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找来自同一表的行之间的差异的oracle11g sql

查找来自同一表的行之间的差异的oracle11g sql
EN

Stack Overflow用户
提问于 2012-09-03 07:24:06
回答 1查看 1.1K关注 0票数 0

我有一个表示例,它有唯一的列(sal_id,gal_id)和金额、税收、日期和更多的列。

样本表

代码语言:javascript
复制
 actual_id, sal_id, gal_id, processed_flag, amount, tax     date    
   1          101     201     Y             10       1     25-Aug-12  
   2          101     201     Y             20       3     27-Aug-12  
   3          101     201     N             15       2     29-Aug-12  

现在,我需要找出未处理的数据(进程_标志=‘N’)和具有最大日期的数据(进程_标志=‘Y’)之间的区别。我需要计算(sal_id + gal_id)组合的金额和税额之间的差额。

因此,查询返回应该如下所示:

在本例中,由于对于(101,201),我们有2个已处理行和(actual_id 2具有最大日期)。因此需要找出actual_id 3和actual_id 2行之间的区别。

代码语言:javascript
复制
actual_id,  sal_id,  gal_id, total_amount, total_tax  date    
    3          101     201    -5 (15-20)    -1 (2-3)   29-Aug-12   

我正在使用Oracle 11g。请帮帮我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-03 08:55:46

试试这个:

代码语言:javascript
复制
WITH t AS (SELECT DISTINCT "sal_id" sid,"gal_id" gid,"processed_flag" pf, max("amount") over
(partition BY "sal_id","gal_id","processed_flag") am,
max("tax") over
(partition BY "sal_id","gal_id","processed_flag") tx,
           max("actual_id") over
(partition BY "sal_id","gal_id","processed_flag") aid,
           max("date") over
(partition BY "sal_id","gal_id","processed_flag") dt
FROM sample)
SELECT t1.aid, t1.sid, t1.gid, t1.am-t2.am, t1.tx-t2.tx, t1.dt FROM t t1 JOIN t t2 ON t1.sid=t2.sid AND t1.gid=t2.gid
WHERE t1.pf='N' AND t2.pf='Y';

这里是个小提琴

更新:前面的答案假设max(日期)也有最大值(金额)。

一个更好的解决办法可以是:

代码语言:javascript
复制
WITH t AS (SELECT *
FROM sample s
WHERE s."date" = (SELECT max("date") FROM sample s_in
                WHERE s_in."sal_id" = s."sal_id"
                AND s_in."gal_id" = s."gal_id"
                AND s_in."processed_flag" = s."processed_flag"))
SELECT t1."actual_id", t1."sal_id", t1."gal_id", t1."amount"-t2."amount" total_amount, t1."tax"-t2."tax" total_tax, t1."date"
FROM t t1 JOIN t t2 ON t1."sal_id"=t2."sal_id" AND t1."gal_id"=t2."gal_id"
WHERE t1."processed_flag"='N' AND t2."processed_flag"='Y';

这里是小提琴

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12243585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档