Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/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:如何在WHERE子句中使用MAX函数?_Mysql_Sql - Fatal编程技术网

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 )