0

OK、これは私の問題を解決するための 2 回目の試みです。

レポートのクエリを開発していますが、データベースからデータを取得している間、このレポートには存在しないいくつかの行が入力されるはずです。説明のために、これらのテーブルがあるとしましょう:

Table 1 - Companies

Table 2 - Transactions.

Table 3 - Transaction types.

ほとんどの企業がすべての取引タイプの取引を行っているわけではないという重要な詳細。レポートのロジックでは、すべての企業を表示する必要がありますが、実際の価値を持つ「本物の」企業と、存在しない $0 の企業があります。問題はここから始まります。これは、トランザクション タイプが論理グループにまとめられているためです。たとえば、ある企業に type_1 の実際のトランザクションが 1 つしかない場合、レポートには、type_2、type_3、type_4 など、type_1 に関連付けられた他のタイプの「$0」レコードが含まれているはずです。会社が type_1 と type_2 のトランザクションを持っている場合、レポートには、異なるトランザクション タイプ グループなどからの他のいくつかのトランザクション タイプを入力する必要があります。

ここでの問題は、実行する環境が純粋なSQLでなければならないことです(Javaプログラマーであるため、データベースのクエリ、配列[] []へのデータのロード、欠落しているトランザクションタイプの追加がいかに簡単かを理解しています)-しかし、クエリはUNIXでplsqlバッチ内で実行されるため、単一(または結合)選択する必要があります。

前もって感謝します。どんな助けやアイデアも大歓迎です!

4

2 に答える 2

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

これにより、すべてのトランザクションタイプおよび関連するトランザクションの合計に対してすべての会社に対して1つの行が生成されます(会社とトランザクションタイプの組み合わせのトランザクションがない場合は0)。

于 2012-04-10T18:05:15.523 に答える
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
于 2012-04-10T18:04:52.933 に答える