【问题标题】:MySQL query results return unexpected dataMySQL 查询结果返回意外数据
【发布时间】:2013-01-04 03:05:45
【问题描述】:

我正在尝试对自定义报告运行查询,该报告应该根据指定日期范围内的贷款还款类型为符合五个条件的客户返回数据。标准为 Salary DeductionBank Standing OrderSelf-PayPost Dated Cheques Bank Debit。结果应返回来自每个指定条件的客户端数量的计数。但是,这不是我目前得到的结果;这些查询正在针对此软件进行测试,Mambu。结果取决于 customfieldcustomfieldvalue指定要使用的还款类型)列。这就是我期望的结果应该是这样的:

++++++++++++++++++++++++++++++++++++++++++++++++++++++
| 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

查询 #1.1
在上面添加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

查询 #2
我什至尝试使用CASE 语句执行此操作,但它仅将Clients 的所有行返回为NULL,并且需要大约12.1 秒才能完成。

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

我在这里做错了什么,导致我无法获得想要的结果?提前致谢。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    对于查询2,需要加括号,或者使用in语法:

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

    与正确使用 where 语法一样重要的是修复 from 子句中的 join 语法:

    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 是如何连接到其他表的?

    【讨论】:

    • CustomFieldValue 为用户提供了在他们的表单中动态添加特定字段的灵活性。在数据字典中,图表显示它们与其他表分离,因此任何表单都可以有一个 CustomField。
    • 并且自定义值未连接到客户、贷款或任何其他实体?
    • 连接到client表。
    【解决方案2】:

    引用(操作顺序)在这里非常重要,你错过了它们,这就是问题所在。

    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
    

    【讨论】:

      【解决方案3】:

      有几个项目脱颖而出。 首先,您似乎正在尝试加入 4 个文件,但只定义了 1 个连接 - 在构建复杂连接时,一次添加 1 个文件有时会有所帮助。

      您还使用 GROUP BY 而不汇总任何内容 - 您确定这是您的意图吗?如果你想要一个计数,你可以使用count(*),然后所有其他列都需要包含在 GROUP BY 子句中。

      【讨论】:

      • 是的,这就是我想要的。我最初有 count(*),但我删除了它以显示实际客户的名称,这样我就可以验证我从软件的输出中返回的数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      • 2020-09-17
      • 2016-09-10
      相关资源
      最近更新 更多