【问题标题】:I am getting an SQLCODE=-119 in DB2我在 DB2 中得到一个 SQLCODE=-119
【发布时间】:2020-04-06 00:50:37
【问题描述】:

我正在将 MySql 转换为 DB2 查询,到目前为止我得到了这个:

SELECT
    loandata.*,
    SUM(lc.amount_outstanding_derived) AS chargesDue
FROM
    (
    SELECT
        cl.display_name AS clientName,
        cl.id AS clientId,
        ln.id AS loanId,
        ln.account_no AS accountId,
        ln.loan_status_id AS accountStatusId,
        pl.short_name AS productShortName,
        ln.product_id AS productId,
        ln.currency_code AS currencyCode,
        ln.currency_digits AS currencyDigits,
        ln.currency_multiplesof AS inMultiplesOf,
        rc.name AS currencyName,
        rc.display_symbol AS currencyDisplaySymbol,
        rc.internationalized_name_code AS currencyNameCode,
        CASE WHEN ln.loan_status_id = 200 THEN ln.principal_amount
        ELSE NULL
END AS disbursementAmount,
    SUM(COALESCE((CASE WHEN ln.loan_status_id = 300 THEN ls.principal_amount ELSE 0.0 END), 0.0) - COALESCE(CASE WHEN ln.loan_status_id = 300 THEN ls.principal_completed_derived ELSE 0.0 END, 0.0)) AS principalDue,
    ln.principal_repaid_derived AS principalPaid,
    SUM(COALESCE(CASE WHEN ln.loan_status_id = 300 THEN ls.interest_amount ELSE 0.0 END, 0.0) - COALESCE(CASE WHEN ln.loan_status_id = 300 THEN ls.interest_completed_derived ELSE 0.0 END, 0.0)) AS interestDue,
    ln.interest_repaid_derived AS interestPaid,
    SUM(COALESCE(CASE WHEN ln.loan_status_id = 300 THEN ls.fee_charges_amount ELSE 0.0 END, 0.0) - COALESCE(CASE WHEN ln.loan_status_id = 300 THEN ls.fee_charges_completed_derived ELSE 0.0 END, 0.0)) AS feeDue,
    ln.fee_charges_repaid_derived AS feePaid
FROM
    m_loan LN
JOIN m_client cl ON
    cl.id = ln.client_id
LEFT JOIN m_office OF ON
    of.id = cl.office_id
    AND of.hierarchy LIKE ?
LEFT JOIN m_product_loan pl ON
    pl.id = ln.product_id
LEFT JOIN m_currency rc ON
    rc.code = ln.currency_code
JOIN m_loan_repayment_schedule ls ON
    ls.loan_id = ln.id
    AND ls.completed_derived = 0
    AND ls.duedate <= ?
WHERE
    of.id = ?
    AND (ln.loan_status_id = 300)
    AND ln.group_id IS NULL
)  AS loandata
LEFT JOIN m_loan_charge lc ON
    lc.loan_id = loandata.loanId
    AND lc.is_paid_derived = 0
    AND lc.is_active = 1
    AND ( lc.due_for_collection_as_of_date <= ?
    OR lc.charge_time_enum = 1)
GROUP BY
    loandata.clientId,
    loandata.loanId
ORDER BY
    loandata.clientId,
    loandata.loanId

但我收到一个错误:

SQL 错误 [42803]:以“DISBURSEMENTAMOUNT”开头的表达式 在 SELECT 子句、HAVING 子句或 ORDER BY 子句中指定的不是 在 GROUP BY 子句中指定或在 SELECT 子句中,HAVING 子句或带有列函数但没有 GROUP BY 的 ORDER BY 子句 子句被指定.. SQLCODE=-119, SQLSTATE=42803, DRIVER=4.26.14

我尝试为 select 子句项分别插入 Group by 和 Order By 子句,如下所示:

SELECT
    loandata.*,
    SUM(lc.amount_outstanding_derived) AS chargesDue
FROM
    (
    SELECT
        cl.display_name AS clientName,
        cl.id AS clientId,
        ln.id AS loanId,
        ln.account_no AS accountId,
        ln.loan_status_id AS accountStatusId,
        pl.short_name AS productShortName,
        ln.product_id AS productId,
        ln.currency_code AS currencyCode,
        ln.currency_digits AS currencyDigits,
        ln.currency_multiplesof AS inMultiplesOf,
        rc.name AS currencyName,
        rc.display_symbol AS currencyDisplaySymbol,
        rc.internationalized_name_code AS currencyNameCode,
        CASE WHEN ln.loan_status_id = 200 THEN ln.principal_amount
        ELSE NULL
END AS disbursementAmount,
    SUM(COALESCE((CASE WHEN ln.loan_status_id = 300 THEN ls.principal_amount ELSE 0.0 END), 0.0) - COALESCE(CASE WHEN ln.loan_status_id = 300 THEN ls.principal_completed_derived ELSE 0.0 END, 0.0)) AS principalDue,
    ln.principal_repaid_derived AS principalPaid,
    SUM(COALESCE(CASE WHEN ln.loan_status_id = 300 THEN ls.interest_amount ELSE 0.0 END, 0.0) - COALESCE(CASE WHEN ln.loan_status_id = 300 THEN ls.interest_completed_derived ELSE 0.0 END, 0.0)) AS interestDue,
    ln.interest_repaid_derived AS interestPaid,
    SUM(COALESCE(CASE WHEN ln.loan_status_id = 300 THEN ls.fee_charges_amount ELSE 0.0 END, 0.0) - COALESCE(CASE WHEN ln.loan_status_id = 300 THEN ls.fee_charges_completed_derived ELSE 0.0 END, 0.0)) AS feeDue,
    ln.fee_charges_repaid_derived AS feePaid
FROM
    m_loan LN
JOIN m_client cl ON
    cl.id = ln.client_id
LEFT JOIN m_office OF ON
    of.id = cl.office_id
    AND of.hierarchy LIKE ?
LEFT JOIN m_product_loan pl ON
    pl.id = ln.product_id
LEFT JOIN m_currency rc ON
    rc.code = ln.currency_code
JOIN m_loan_repayment_schedule ls ON
    ls.loan_id = ln.id
    AND ls.completed_derived = 0
    AND ls.duedate <= ?
WHERE
    of.id = ?
    AND (ln.loan_status_id = 300)
    AND ln.group_id IS NULL
GROUP BY 
        cl.display_name,
        cl.id,
        ln.id,
        ln.account_no,
        ln.loan_status_id,
        pl.short_name,
        ln.product_id,
        ln.currency_code,
        ln.currency_digits,
        ln.currency_multiplesof,
        rc.name,
        rc.display_symbol,
        rc.internationalized_name_code,
        ln.loan_status_id,
        ln.principal_amount,
        ln.principal_repaid_derived,
        ln.interest_repaid_derived,
        ln.fee_charges_repaid_derived
ORDER BY 
        cl.display_name,
        cl.id,
        ln.id,
        ln.account_no,
        ln.loan_status_id,
        pl.short_name,
        ln.product_id,
        ln.currency_code,
        ln.currency_digits,
        ln.currency_multiplesof,
        rc.name,
        rc.display_symbol,
        rc.internationalized_name_code,
        ln.loan_status_id,
        ln.principal_amount,
        ln.principal_repaid_derived,
        ln.interest_repaid_derived,
        ln.fee_charges_repaid_derived
    )  AS loandata
LEFT JOIN m_loan_charge lc ON
    lc.loan_id = loandata.loanId
    AND lc.is_paid_derived = 0
    AND lc.is_active = 1
    AND ( lc.due_for_collection_as_of_date <= ?
    OR lc.charge_time_enum = 1)
GROUP BY
    loandata.clientId,
    loandata.loanId
ORDER BY
    loandata.clientId,
    loandata.loanId

【问题讨论】:

    标签: sql db2


    【解决方案1】:

    您的查询的大致简化如下:

    SELECT loandata.*,
            SUM(lc.amount_outstanding_derived) AS chargesDue
    FROM (SELECT <lots of columns>
          FROM <lots of tables>
          . . .
         ) loandata LEFT JOIN
         m_loan_charge lc
         ON lc.loan_id = loandata.loanId AND
            lc.is_paid_derived = 0 AND
            lc.is_active = 1 AND
            ( lc.due_for_collection_as_of_date <= ? OR lc.charge_time_enum = 1)
    GROUP BY loandata.clientId, loandata.loanId
    ORDER BY loandata.clientId, loandata.loanId;
    

    您有一个 SELECT * 引入了许多列。美好的。然后你有一个聚合函数——所以查询是一个聚合查询。需要有很多列的GROUP BY

    但我没有找到。我只找到一个有两列的GROUP BY。这是 SQL 中的错误。令人高兴的是,这现在是最新版本的 MySQL 中的一个错误。基本上在所有其他数据库中。

    您需要列出GROUP BY 中未在SELECT 中聚合的所有列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多