好的,这是第二次尝试解决我的问题,对于那些第二次读这个问题的人,我希望它能够清楚地理解问题。
我正在为报告开发查询,问题是在从数据库检索数据时,此报告应填充一些不存在的行。为了说明目的,我可以说我有这些表:
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批处理,因此它应该是单个(或连接)选择。
提前致谢。任何帮助或想法将非常感谢!
答案 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