Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询结果返回意外数据_Mysql_Sql - Fatal编程技术网

MySQL查询结果返回意外数据

MySQL查询结果返回意外数据,mysql,sql,Mysql,Sql,我正在尝试运行一个自定义报告的查询,该报告应返回符合五个条件的客户的数据,这些条件基于指定日期范围内的贷款还款类型。标准为工资扣减,银行定期汇票,自助支付,期票和银行借记。结果应返回来自每个指定条件的客户端数量计数。然而,这不是我目前得到的结果;正在针对此软件测试这些查询。结果取决于自定义字段和自定义字段值(指定要使用的还款类型)列。这就是我期望得到的结果的样子: ++++++++++++++++++++++++++++++++++++++++++++++++++++++ | LoanProdu

我正在尝试运行一个自定义报告的查询,该报告应返回符合五个条件的客户的数据,这些条件基于指定日期范围内的贷款还款类型。标准为
工资扣减
银行定期汇票
自助支付
期票
银行借记
。结果应返回来自每个指定条件的客户端数量计数。然而,这不是我目前得到的结果;正在针对此软件测试这些查询。结果取决于
自定义字段
自定义字段值
(指定要使用的还款类型)列。这就是我期望得到的结果的样子:

++++++++++++++++++++++++++++++++++++++++++++++++++++++
| 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
添加到上面不会产生任何结果:

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
语句来执行此操作,但它只将
客户端的所有行作为
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
我在这里做错了什么,阻止了我获得想要的结果?提前感谢。

报价单(操作顺序)在这里非常重要,您缺少它们,这就是问题所在

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()


对于查询2,您需要添加括号,或在
语法中使用

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

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


此外,您正在使用GROUP BY,但没有聚合任何内容-您确定这就是您想要的吗?如果需要计数,可以使用
count(*)
,然后所有其他列都需要包含在GROUPBY子句中

CustomFieldValue为用户提供了动态向表单添加特定字段的灵活性。在数据字典中,图表显示它们与其他表分离,因此任何表单都可以有CustomField。自定义值未连接到客户、贷款或任何其他实体?它连接到
客户
表。是的,这是我的意图。我最初有
计数(*)
,但我删除了它以显示实际客户的名称,这样我就可以通过软件的输出来验证返回的数据。
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')