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