MySQL:如何在WHERE子句中使用MAX函数?
这是我的查询生成的MySQL:如何在WHERE子句中使用MAX函数?,mysql,sql,Mysql,Sql,这是我的查询生成的 LOANTYPE | TOTALBALANCE | STATUS | --------------------|--------------|--------| Conventional Loans | 52.84 | Active | Conforming Loans | 45.55 | Active | Non-Conforming Loans| 43.90 | Active |
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 |
TOTALBALANCE列是每个贷款类型的活动帐户和非活动帐户的总和
这是我的问题
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
我想获得活跃/不活跃账户的总余额,以及每个贷款类型的活跃/不活跃账户数量
我补充说
和日期\u ADDMAXtransaction.PAYMENTDATES,间隔6个月>WHERE子句中的当前\u日期
限制结果,但它仍然给我错误
我会/应该在我的查询中修改什么以实现我的想法。
感谢您抽出时间。使用条件聚合。下面的基本思想是,我们使用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表中。这个怎么样
SELECT product.loantype,
active.totalbalance AS ACTIVEBALANCE,
active.cnt AS ACTIVE,
incative.totalbalance AS INACTIVEBALANCE,
inactive.cnt AS INACTIVE
FROM product
left join (SELECT product.loantype,
SUM(account.principalbalance
+ account.interestbalance) AS TOTALBALANCE,
COUNT(1) AS cnt
FROM account
inner join client
ON account.accountkey = client.primarykey
inner join product
ON account.productkey = product.primarykey
WHERE TRANSACTION.TYPE = 'REPAYMENT'
AND Current_date() > (SELECT DATE_ADD(MAX(
TRANSACTION.paymentdates),
interval 6 month)
FROM TRANSACTION
WHERE TYPE = 'REPAYMENT'
AND TRANSACTION.accountkey
=
account.accountkey)
GROUP BY product.loantype) AS active
ON( product.loantype = active.loantype )
left join (SELECT product.loantype,
SUM(account.principalbalance
+ account.interestbalance) AS TOTALBALANCE,
COUNT(1) AS cnt
FROM account
inner join client
ON account.accountkey = client.primarykey
inner join product
ON account.productkey = product.primarykey
WHERE TRANSACTION.TYPE = 'REPAYMENT'
AND Current_date() < (SELECT DATE_ADD(MAX(
TRANSACTION.paymentdates),
interval 6 month)
FROM TRANSACTION
WHERE TYPE = 'REPAYMENT'
AND TRANSACTION.accountkey
=
account.accountkey)
GROUP BY product.loantype) AS inactive
ON( product.loantype = inactive.loantype )
HAVING子句被添加到SQL中,因为WHERE关键字不能用于聚合函数。谢谢先生/女士。我会读到关于have子句的内容。谢谢先生/女士,但上面写的是相同的错误代码:1111。组函数的使用无效,是loanaccount=帐户。感谢you@dhie试试我最新的答案。我用你最初的逻辑很快地回答了,我没有费心去检查。
SELECT product.loantype,
active.totalbalance AS ACTIVEBALANCE,
active.cnt AS ACTIVE,
incative.totalbalance AS INACTIVEBALANCE,
inactive.cnt AS INACTIVE
FROM product
left join (SELECT product.loantype,
SUM(account.principalbalance
+ account.interestbalance) AS TOTALBALANCE,
COUNT(1) AS cnt
FROM account
inner join client
ON account.accountkey = client.primarykey
inner join product
ON account.productkey = product.primarykey
WHERE TRANSACTION.TYPE = 'REPAYMENT'
AND Current_date() > (SELECT DATE_ADD(MAX(
TRANSACTION.paymentdates),
interval 6 month)
FROM TRANSACTION
WHERE TYPE = 'REPAYMENT'
AND TRANSACTION.accountkey
=
account.accountkey)
GROUP BY product.loantype) AS active
ON( product.loantype = active.loantype )
left join (SELECT product.loantype,
SUM(account.principalbalance
+ account.interestbalance) AS TOTALBALANCE,
COUNT(1) AS cnt
FROM account
inner join client
ON account.accountkey = client.primarykey
inner join product
ON account.productkey = product.primarykey
WHERE TRANSACTION.TYPE = 'REPAYMENT'
AND Current_date() < (SELECT DATE_ADD(MAX(
TRANSACTION.paymentdates),
interval 6 month)
FROM TRANSACTION
WHERE TYPE = 'REPAYMENT'
AND TRANSACTION.accountkey
=
account.accountkey)
GROUP BY product.loantype) AS inactive
ON( product.loantype = inactive.loantype )