查询和添加行

时间:2012-04-10 17:32:35

标签: sql oracle11gr2

好的,这是第二次尝试解决我的问题,对于那些第二次读这个问题的人,我希望它能够清楚地理解问题。

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

Table 1 - Companies

Table 2 - Transactions.

Table 3 - Transaction types.

大多数公司没有所有交易类型的交易的重要细节。虽然报告逻辑要求公司与所有公司一起玩耍:具有真实货币价值的“真实”公司和其他只有0美元的现有公司。问题从此处开始,因为事务类型组合在逻辑组中,因此假设公司只有1个类型为1的实际事务,报告应包含与type_1关联的其他类型的“$ 0”记录,如type_2,type_3和type_4。如果公司具有type_1和type_2的事务,则应使用来自不同事务类型组的其他一些tran类型填充报告。

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

提前致谢。任何帮助或想法将非常感谢!

2 个答案:

答案 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)。

答案 1 :(得分: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