0

好的,这是解决我的问题的第二次尝试,对于那些将第二次阅读本文的人,我希望它足够清楚以理解问题。

我正在为报告开发一个查询,问题是在从数据库中检索数据时,该报告应该填充一些不存在的行。为了说明目的,假设我有这些表:

Table 1 - Companies

Table 2 - Transactions.

Table 3 - Transaction types.

大多数公司没有所有交易类型的交易的重要细节。尽管报告逻辑需要对所有这些公司进行反演:具有真实货币价值的“真实”公司和其他只有 0 美元的不存在的公司。问题从这里开始,因为交易类型组合在逻辑组中,所以假设一家公司只有 1 笔 type_1 的真实交易,报告应该包含与 type_1 相关的其他类型的“$0”记录,如 type_2、type_3 和 type_4。如果公司有 type_1 和 type_2 的交易,报告应填充来自不同交易类型组等的其他一些交易类型。

这里的问题是它应该执行的环境必须是纯 sql(作为一个 java 程序员,我知道查询数据库、将数据加载到 array[][] 并添加缺少的事务类型是多么容易)——但是查询应该在 plsql 批处理中的 UNIX 上运行,因此它应该是单个(或连接)选择。

提前致谢。任何帮助或想法将不胜感激!

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

这应该为每个公司为每个交易类型和相关交易的总和生成一行(如果公司和交易类型的组合没有交易,则为 0)。

于 2012-04-10T18:05:15.523 回答
0

您可以使用两个子查询,一个是根据公司现有类型查找每个公司的所有交易,第二个是查找总数。

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 回答