Я получаю SQLCODE = -119 в DB2 - PullRequest
       4

Я получаю SQLCODE = -119 в DB2

0 голосов
/ 06 апреля 2020

Я конвертировал 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 или предложении ORDER BY со столбцом функция и предложение GROUP BY не указано. SQLCODE = -119, SQLSTATE = 42803, DRIVER = 4.26.14

Я попытался вставить каждое из предложений Group by и Order By для таких элементов предложения select, как итак:

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

1 Ответ

1 голос
/ 06 апреля 2020

Общее упрощение вашего запроса:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...