2012-09-03 94 views
0

我有一个表样本具有唯一的列(sal_id,gal_id)和金额,税额,日期和一些更多的列。oracle11g sql查找同一表中的行之间的差异

试样台

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 

现在我需要找到之间的差未处理(process_flag = 'N'),并进行数据(process_flag = 'Y'),其具有最大的日期。我需要计算(sal_id + gal_id)组合的金额和税额之间的差异。

因此,该查询返回应该是这样的:

在这个例子中,由于为(101,201),我们有有最大日期2加工行(ACTUAL_ID 2所以需要找到ACTUAL_ID之间的差异。 。3 & ACTUAL_ID 2排

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请帮我

+1

你会与量呢?减去未处理的流程,反之亦然?你是什​​么意思sal_id + gal_id?结合这两个ID?或其参考表的值? –

+0

需要计算(未处理金额 - 处理金额)和(未处理税收处理税金)。组合actual_id,sal_id,gal_id,为SAMPLE表格创建唯一标识的日期。 –

回答

1

试试这个:

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'; 

Here是小提琴


UPDATE:以前的答案假定最大(日)也有MAX(量)。
一个更好的解决方案可能是:

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'; 

Here是小提琴

+0

谢谢@ A.B.Cade。它以我期望的方式工作。非常感谢。由于我们使用这么多的分区,查询的性能如何? –

+0

嗨凯德..我需要actual_id也在结果查询。我通过添加“actual_id”aaa来修改查询,但在结果查询中获取两行。请帮我修改查询。 –

+0

但是你有actual_id(别名为aid)。这里是锯齿字段后的小提琴http://www.sqlfiddle.com/#!4/fc505/15。顺便说一句,想想很多,我的答案认为,最大(税)将有可能不是真正的最大(日期)... –