オラクルでは、関数を使用すると、句LISTAGG
で分析的に使用できます。OVER (PARTITION BY column..)
ただし、ROWS
またはRANGE
キーワードによるウィンドウ処理の使用はサポートされていません。
店舗レジスターからのデータセットがあります(質問のために簡略化されています)。登録テーブルの数量は常に 1 であることに注意してください。つまり、1 つのアイテム、1 つのトランザクション ラインです。
TranID TranLine ItemId OrderID Dollars Quantity
------ -------- ------ ------- ------- --------
1 101 23845 23 2.99 1
1 102 23845 23 2.99 1
1 103 23845 23 2.99 1
1 104 23845 23 2.99 1
1 105 23845 23 2.99 1
このデータを、アイテムが数量別にグループ化される特別注文システムのテーブルに「一致」させる必要があります。システムでは、複数のラインで同じアイテム ID を持つことができることに注意してください (アイテムが同じであっても、注文されたコンポーネントは異なる場合があります)。
ItemId OrderID Order Line Dollars Quantity
------ ------- ---------- ------- --------
23845 23 1 8.97 3
23845 23 2 5.98 2
このデータを照合できる唯一の方法は、注文 ID、商品 ID、および金額によるものです。
基本的に、次の結果に到達する必要があります。
ItemId OrderID Order Line Dollars Quantity Tran ID Tran Lines
------ ------- ---------- ------- -------- ------- ----------
23845 23 1 8.97 3 1 101;102;103
23845 23 2 5.98 2 1 104;105
tran 行が何らかの方法で注文されているかどうかは特に気にしません。気にするのは、金額が一致することと、特別注文の合計を計算する際にレジスターの行を「再利用」しないことだけです。トランザクション行をテーブルに分割する必要はありません。これはレポート目的のためであり、粒度が登録トランザクション行レベルに戻ることはありません。
私の最初の考えは、分析関数を使用して「ベスト マッチ」を実行し、注文システムで金額と数量に一致する最初の行セットを特定することで、次のような結果セットが得られるというものでした。
TranID TranLine ItemId OrderID Dollars Quantity CumDollar CumQty
------ -------- ------ ------- ------- -------- -------- ------
1 101 23845 23 2.99 1 2.99 1
1 102 23845 23 2.99 1 5.98 2
1 103 23845 23 2.99 1 8.97 3
1 104 23845 23 2.99 1 11.96 4
1 105 23845 23 2.99 1 14.95 5
ここまでは順調ですね。しかし、次にクエリに LISTAGG を追加しようとします。
SELECT tranid, tranline, itemid, orderid, dollars, quantity,
SUM(dollars) OVER (partition by tranid, itemid, orderid order by tranline) cumdollar,
SUM(quantity) OVER (partition by tranid, itemid, orderid order by tranline) cumqty
LISTAGG (tranline) within group (order by tranid, itemid, orderid, tranline) OVER (partition by tranid, itemid, orderid)
FROM table
累積集計ではなく、常に完全な集計を返すことがわかりました。
TranID TranLine ItemId OrderID Dollars Quantity CumDollar CumQty ListAgg
------ -------- ------ ------- ------- -------- -------- ------ -------
1 101 23845 23 2.99 1 2.99 1 101;102;103;104;105
1 102 23845 23 2.99 1 5.98 2 101;102;103;104;105
1 103 23845 23 2.99 1 8.97 3 101;102;103;104;105
1 104 23845 23 2.99 1 11.96 4 101;102;103;104;105
1 105 23845 23 2.99 1 14.95 5 101;102;103;104;105
したがって、これは役に立ちません。
可能であれば、SQLでこれを行うことをお勧めします。カーソルと手続き型ロジックを使用してこれを実行できることを認識しています。
LISTAGG 分析関数、またはこれをサポートする別の分析関数でウィンドウ処理を行う方法はありますか?
私は11gR2を使用しています。