0

一意の列(sal_id、gal_id)と金額、税金、日付、その他の列を持つテーブルSAMPLEがあります。

サンプルテーブル

 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 を使用しています。私を助けてください。

4

1 に答える 1

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

ここにフィドルがあります


更新:前の回答では、max(date) にも max(amount) があると想定しています。
より良い解決策は次のとおりです。

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

ここにフィドルがあります

于 2012-09-03T08:55:46.643 に答える