【问题标题】:Querying and adding rows查询和添加行
【发布时间】:2012-04-11 02:57:35
【问题描述】:

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

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

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 的交易,报告应该填充来自不同交易类型组等的一些其他 tran 类型。

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

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

【问题讨论】:

    标签: sql oracle11gr2


    【解决方案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 - 正如 Frank 当您在 OTN forums.oracle.com/forums/… 上提出这个问题时指出的那样,发布表结构、一些示例数据和预期输出将非常有帮助。因此,对于没有真实交易的 company_nametransaction_type 的任意组合,您想要所有真实交易加上一笔虚假交易?
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2021-12-13
      相关资源
      最近更新 更多