这是我的查询生成的。
LOANTYPE | TOTALBALANCE | STATUS |
--------------------|--------------|--------|
Conventional Loans | 52.84 | Active |
Conforming Loans | 45.55 | Active |
Non-Conforming Loans| 43.90 | Active |
Secured Loans | 42.73 | Active |
Unsecured Loans | 34.99 | Active |
Open-ended Loans | 11.99 | Active |
Close-ended Loans | 11.69 | Active |
The
TOTALBALANCE
column is the summation of both Active and Inactive accounts perLOANTYPE
.
这是我的问题
SELECT
product.LOANTYPE,
SUM(account.PRINCIPALBALANCE + account.INTERESTBALANCE) AS TOTALBALANCE,
IF(DATE_ADD(MAX(transaction.PAYMENTDATES),
INTERVAL 6 MONTH) > CURRENT_DATE(),
'Active',
'Innactive') AS LOANSTATUS
FROM
account
INNER JOIN
client ON account.ACCOUNTKEY = client.PRIMARYKEY
INNER JOIN
product ON account.PRODUCTKEY = product.PRIMARYKEY
INNER JOIN
transaction ON transaction.ACCOUNTKEY = loanaccount.PRIMARYKEY
WHERE
transaction.TYPE = 'REPAYMENT'
GROUP BY product.LOANTYPE
我想像这样获取事件/非事件帐户的 TOTALBALANCE
以及每个 LOANTYPE
的事件/非事件帐户数量。
LOANTYPE | ACTIVEBALANCE | ACTIVE# | INACTIVEBALANCE | INNACTIVE#
--------------------|---------------|---------|-----------------|------------
Conventional Loans | 35.23 | 2 | 17.61 | 1
Conforming Loans | 18.22 | 1 | 27.33 | 1
Non-Conforming Loans| 32.486 | 2 | 11.414 | 2
Secured Loans | 17.092 | 2 | 25.638 | 1
Unsecured Loans | 40.61 | 2 | 5.6112 | 1
Open-ended Loans | 7.194 | 1 | 4.796 | 1
Close-ended Loans | 6.4395 | 2 | 5.26 | 2
我加了
AND DATE_ADD(MAX(transaction.PAYMENTDATES),INTERVAL 6 MONTH) > CURRENT_DATE()
在 WHERE 子句中
限制结果,但它仍然给我错误。
为了实现我的想法,我会/应该在我的查询中修改什么。 感谢您的宝贵时间。
最佳答案
使用条件聚合。下面的基本思想是,我们使用 CASE
表达式有条件地获取余额总和或记录计数,具体取决于记录是分类为事件还是非事件。
SELECT
product.LOANTYPE,
SUM(CASE WHEN DATE_ADD(t.PAYMENTDATES, INTERVAL 6 MONTH) > CURRENT_DATE()
THEN account.PRINCIPALBALANCE + account.INTERESTBALANCE
ELSE 0 END) AS ACTIVEBALANCE,
COUNT(CASE WHEN DATE_ADD(t.PAYMENTDATES, INTERVAL 6 MONTH) > CURRENT_DATE()
THEN 1 END) AS ACTIVE_CNT,
SUM(CASE WHEN DATE_ADD(t.PAYMENTDATES, INTERVAL 6 MONTH) <= CURRENT_DATE()
THEN account.PRINCIPALBALANCE + account.INTERESTBALANCE
ELSE 0 END) AS INACTIVEBALANCE,
COUNT(CASE WHEN DATE_ADD(t.PAYMENTDATES, INTERVAL 6 MONTH) <= CURRENT_DATE()
THEN 1 END) AS INACTIVE_CNT
FROM account a
INNER JOIN client c
ON a.ACCOUNTKEY = c.PRIMARYKEY
INNER JOIN product p
ON a.PRODUCTKEY = p.PRIMARYKEY
INNER JOIN
(
SELECT ACCOUNTKEY, MAX(PAYMENTDATES) AS PAYMENTDATES
FROM transaction
WHERE TYPE = 'REPAYMENT'
GROUP BY ACCOUNTKEY
) t
ON t.ACCOUNTKEY = a.PRIMARYKEY
GROUP BY
p.LOANTYPE;
请注意,在您的问题中,您引用了 loanaccount
表,但该表在实际查询中无处出现。我假设您打算用它来引用 account
表。
关于MySQL:如何在 WHERE 子句中使用 MAX 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48656593/