MySQL:如何在 WHERE 子句中使用 MAX 函数?

标签 mysql sql

这是我的查询生成的。

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 per LOANTYPE.

这是我的问题

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/

相关文章:

mysql - Sequelize findOrCreate 不排除排除数组中定义的属性

php - 如何使用变量更新 mysql?

sql - 另一个内部的 EXEC 存储过程不等待完成

SQL查询限制记录

sql - hive 中两条记录之间的差异

MySQL 在 case 语句中保留类型

mysql - 具有时间戳条件的性能

c# - 使用 Entity Framework 在 Visual Studio 中连接 MySQL DB 时出现问题

mysql - 在 mysql5 中创建更新操作触发器时出错?

sql - 获取具有相同 id 值的最长字符串的字段