2012-04-10 11 views
0

これは問題を解決するための2回目の試みです。これを2度目に読んでいただいた方には、問題を理解するのに十分なことが分かります。行を照会して追加する

私はレポートのクエリを開発していますが、データベースからデータを取得する際に、このレポートは存在しないいくつかの行に値を設定する必要があります。企業のほとんどは、すべてのトランザクションタイプのトランザクションを持っていないこと

Table 1 - Companies 

Table 2 - Transactions. 

Table 3 - Transaction types. 

重要ディテール:目的を説明するために、私はこれらのテーブルを持って言うことができます。レポートロジックでは、すべての企業を表示する必要がありますが、実際の金額やそれ以外のものは存在せず、わずか$ 0の「実際の」ものを必要とします。トランザクションタイプが論理グループで結合されているため、問題はここから始まります。タイプ1の実際のトランザクションが1つしかない場合、レポートにtype_1、type_3、およびtype_4などの他のタイプのレコードが含まれている必要があります。企業にtype_1とtype_2のトランザクションがある場合、レポートには異なるトランザクションタイプグループなどの他のいくつかのタイプがあります。

ここで問題となるのは、実行する環境が純粋なSQLプログラマー私はデータベースを照会する方法、データを配列[] []にロードして不足しているトランザクションの種類を追加することがどれほど簡単か理解しています) - しかし、クエリはplsqlバッチ内でUNIX上で実行されるべきです。

ありがとうございます。どんな助けやアイデアも非常に高く評価されます!

答えて

0

2つのサブクエリを使用して、企業が持つ既存のタイプに基づいて、1つの企業あたりのすべてのトランザクションを検索し、合計を2番目に見つけることができます。

SELECT companies.id, all_transactions.transaction, COALESCE(sums.total_amount, 0) 
FROM companies 
JOIN (SELECT ct.companyid, t.transaction 
    FROM transactions ct 
    JOIN transactions t ON t.transactiontype = ct.transactiontype 
    GROUP BY ct.companyid, t.transaction) all_transactions ON all_transactions.companyid = companies.companyid 
LEFT JOIN (SELECT ct.companyid, SUM(t.amount) as total_amount 
    FROM transactions ct 
    GROUP BY ct.companyid) sums ON sums.companyid = companies.companyid 
1

外部結合のようなものが必要です。私はあなたのテーブルが互いにどのように関係するかで推測しているが、あなたがすべてのトランザクションの種類ごとに会社および関連取引の合計(または0の場合のために1行を生成する必要があり

SELECT c_typ_cross_join.company_name, 
     c_typ_cross_join.transaction_type, 
     nvl(sum(t.transaction_amount), 0) total_amt 
    FROM (SELECT c.company_name, 
       typ.transaction_type 
      FROM companies c 
       FULL OUTER JOIN transaction_type typ) c_typ_cross_join 
     LEFT OUTER JOIN transactions t ON ( c_typ_cross_join.company_id  = t.company_id 
              AND c_typ_cross_join.transaction_type = t.transaction_typ) 
GROUP BY c_typ_cross_join.company_name, 
      c_typ_cross_join.transaction_type 

このような何かをしたいと思われます企業と取引タイプの組み合わせに対する取引はありません)。

+0

皆さん、本当にありがとうございましたが、実際にはどこにも集計する必要はありません。トランザクションのすべてのリストにする必要があります。 – user1324100

+1

@ user1324100 - FrankがOTN https://forums.oracle.com/forums/thread.jspa?threadID=2373681&tstart=0でこの質問をしたときにFrankが指摘したように、テーブル構造、サンプルデータ、期待される出力。実際のトランザクションがない 'company_name'と' transaction_type'の組み合わせに対して、すべての実際のトランザクションと1つの偽のトランザクションを追加したいのですか? –

関連する問題