簡體   English   中英

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

[英]MySQL: How to use MAX function in WHERE clause?

這是我的查詢生成的內容。

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列是每個LOANTYPE Active 和 Inactive 帳戶的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的主動/ Innactive帳戶以及有多少是有效/無效每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表。

這個怎么樣

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 ) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM