2

指定された日付範囲内のローン返済タイプに基づいて 5 つの条件に一致するクライアントのデータを返すカスタム レポートのクエリを実行しようとしています。基準はSalary DeductionBank Standing OrderSelf-PayPost Dated ChequesおよびBank Debitです。結果は、指定された各基準からのクライアント数のカウントを返す必要があります。ただし、それは私が現在得ている結果ではありません。これらのクエリは、このソフトウェアMambuに対してテストされています。customfield結果は、およびcustomfieldvalue(使用する返済タイプを指定する) 列によって異なります。これは、私が望む結果がどのように見えるかを期待する方法です:

++++++++++++++++++++++++++++++++++++++++++++++++++++++
| LoanProduct           | RepaymentType    | Clients |
++++++++++++++++++++++++++++++++++++++++++++++++++++++
| JUMPSTART LOAN WEEKLY | Self-Pay         | 35      |
------------------------------------------------------
| PAYDAY LOAN MONTHLY   | Salary Deduction | 5       |
------------------------------------------------------
| MICRO-BIZ LOAN        | Bank Debit       | 26      |
------------------------------------------------------
| PAYDAY LOAN WEEKLY    | Self-Pay         | 1       |

  .......
and so on ...

私がこれまでに試した解決策:

クエリ #1:
このクエリでは、特定の返済タイプのカウントなしですべてのクライアントを取得しようとしています。そのシナリオで機能します。

SELECT CONCAT(client.FIRSTNAME, ' ', client.LASTNAME) AS Client, 
    CONCAT(user.FIRSTNAME, ' ', user.LASTNAME) AS Originator, 
    loanproduct.PRODUCTNAME AS LoanProduct, customfieldvalue.VALUE AS RepaymentType
FROM client, user, customfieldvalue, loanaccount
INNER JOIN loanproduct ON loanaccount.PRODUCTTYPEKEY = loanproduct.ENCODEDKEY 
WHERE client.ASSIGNEDUSERKEY = user.ENCODEDKEY 
    AND loanaccount.ACCOUNTHOLDERKEY = client.ENCODEDKEY
    AND customfieldvalue.VALUE = "Bank Debit"
    AND loanaccount.DISBURSEMENTDATE BETWEEN "2012-01-01" AND "2013-01-31"
GROUP BY user.LASTNAME, client.LASTNAME

QUERY #1.1
上記に an を追加しORても結果は得られません:

SELECT CONCAT(client.FIRSTNAME, ' ', client.LASTNAME) AS Client, 
    CONCAT(user.FIRSTNAME, ' ', user.LASTNAME) AS Originator, 
    loanproduct.PRODUCTNAME AS LoanProduct, customfieldvalue.VALUE AS RepaymentType
FROM client, user, customfieldvalue, loanaccount
INNER JOIN loanproduct ON loanaccount.PRODUCTTYPEKEY = loanproduct.ENCODEDKEY 
WHERE client.ASSIGNEDUSERKEY = user.ENCODEDKEY 
    AND loanaccount.ACCOUNTHOLDERKEY = client.ENCODEDKEY
    AND customfieldvalue.VALUE = "Bank Debit" OR customfieldvalue.VALUE = "Self-Pay"
    AND loanaccount.DISBURSEMENTDATE BETWEEN "2012-01-01" AND "2013-01-31"
GROUP BY user.LASTNAME, client.LASTNAME

QUERY #2
ステートメント を使用してこれを実行しようとしましたが、 asCASEのすべての行のみが返され、完了するまでに約 12.1 秒かかります。ClientsNULL

SELECT
    loanproduct.PRODUCTNAME AS LoanProduct, customfieldvalue.VALUE AS RepaymentType,
    CASE
       WHEN customfieldvalue.VALUE = "Salary Deduction" THEN COUNT(CONCAT(client.FIRSTNAME, ' ', client.LASTNAME))
       WHEN customfieldvalue.VALUE = "Bank Standing Order" THEN COUNT(CONCAT(client.FIRSTNAME, ' ', client.LASTNAME))
       WHEN customfieldvalue.VALUE = "Self-Pay" THEN COUNT(CONCAT(client.FIRSTNAME, ' ', client.LASTNAME))
       WHEN customfieldvalue.VALUE = "Post Dated Cheques" THEN COUNT(CONCAT(client.FIRSTNAME, ' ', client.LASTNAME))
       WHEN customfieldvalue.VALUE = "Bank Debit" THEN COUNT(CONCAT(client.FIRSTNAME, ' ', client.LASTNAME))
    END AS Clients
FROM client, user, customfieldvalue, loanaccount
INNER JOIN loanproduct ON  loanaccount.PRODUCTTYPEKEY = loanproduct.ENCODEDKEY
WHERE client.ASSIGNEDUSERKEY = user.ENCODEDKEY
    AND loanaccount.ACCOUNTHOLDERKEY = client.ENCODEDKEY
    AND loanaccount.DISBURSEMENTDATE BETWEEN "2012-01-01" AND "2013-01-31"
GROUP BY user.LASTNAME, client.LASTNAME

ここで私が間違っていることは何ですか? 前もって感謝します。

4

3 に答える 3

1

クエリ 2 では、括弧を追加するか、次のin構文を使用する必要があります。

AND customfieldvalue.VALUE in ('Bank Debit', 'Self-Pay')

where構文を正しく取得するのと同じくらい重要なのは、句のjoin構文を修正することです。from

FROM client join
     user
     on client.ASSIGNEDUSERKEY = user.ENCODEDKEY join
     loanproduct
     ON loanaccount.PRODUCTTYPEKEY = loanproduct.ENCODEDKEY and
        loanaccount.ACCOUNTHOLDERKEY = client.ENCODEDKEY CROSS JOIN
    customFieldValue
where loanaccount.DISBURSEMENTDATE BETWEEN "2012-01-01" AND "2013-01-31" and
      customfieldvalue.value in ('Bank Debit')

まあ、何かが間違っている可能性がすぐにわかります。通常、適切に設計されたデータ ウェアハウスでテーブルをクロス結合することは望ましくありません。CustomFieldValue は他のテーブルにどのように接続されていますか?

于 2013-01-21T03:50:57.897 に答える
0

いくつかのアイテムが目立ちます。まず、4 つのファイルを結合しようとしているように見えますが、定義されている結合は 1 つだけです。複雑な結合を作成するときに、一度に 1 つのファイルを追加すると役立つ場合があります。

また、何も集約せずに GROUP BY を使用しています-それが意図していることですか? 使用できるカウントがcount(*)必要な場合は、他のすべての列を GROUP BY 句に含める必要があります。

于 2013-01-21T03:56:30.337 に答える
0

ここでは、引用符 (操作の順序) が非常に重要です。引用符が欠けています。それが問題です。

SELECT CONCAT(client.FIRSTNAME, ' ', client.LASTNAME) AS Client, 
    CONCAT(user.FIRSTNAME, ' ', user.LASTNAME) AS Originator, 
    loanproduct.PRODUCTNAME AS LoanProduct, customfieldvalue.VALUE AS RepaymentType
FROM client, user, customfieldvalue, loanaccount
INNER JOIN loanproduct ON loanaccount.PRODUCTTYPEKEY = loanproduct.ENCODEDKEY 
WHERE client.ASSIGNEDUSERKEY = user.ENCODEDKEY 
    AND loanaccount.ACCOUNTHOLDERKEY = client.ENCODEDKEY
    AND (customfieldvalue.VALUE = "Bank Debit" OR customfieldvalue.VALUE = "Self-Pay")
    AND loanaccount.DISBURSEMENTDATE BETWEEN "2012-01-01" AND "2013-01-31"
GROUP BY user.LASTNAME, client.LASTNAME

別の方法は、「IN()」を使用することです

SELECT CONCAT(client.FIRSTNAME, ' ', client.LASTNAME) AS Client, 
    CONCAT(user.FIRSTNAME, ' ', user.LASTNAME) AS Originator, 
    loanproduct.PRODUCTNAME AS LoanProduct, customfieldvalue.VALUE AS RepaymentType
FROM client, user, customfieldvalue, loanaccount
INNER JOIN loanproduct ON loanaccount.PRODUCTTYPEKEY = loanproduct.ENCODEDKEY 
WHERE client.ASSIGNEDUSERKEY = user.ENCODEDKEY 
    AND loanaccount.ACCOUNTHOLDERKEY = client.ENCODEDKEY
    AND customfieldvalue.VALUE IN("Bank Debit", "Self-Pay")
    AND loanaccount.DISBURSEMENTDATE BETWEEN "2012-01-01" AND "2013-01-31"
GROUP BY user.LASTNAME, client.LASTNAME
于 2013-01-21T03:48:40.670 に答える