首页 > 解决方案 > 在 SELECT 语句中使用 CASE-WHEN-THEN 时如何在 MySQL 中进行搜索?

问题描述

我有一种情况,我们正在计算一个项目的付款状态。

“CASE”子句用于查找付款状态

现在我需要在 SQL 中对 CASE 语句计算得出的结果进行过滤,例如,如果在过滤器中选择了“已付款”,那么我们只需要查看付款状态为“已付款”的那些记录。

我知道我们不能在 WHERE 子句中使用别名。

在我的例子中,我在 WHERE 子句中添加了一个名为“pm_clause”的别名,但在以下 SQL 中添加以供参考。

有没有办法在 SQL 中应用这样的过滤器?

SELECT DISTINCT rs.id AS rs_id
, SUM(rs.amount_payable) AS revenue
, SUM(rs.amount_recieved) AS receipt
, GROUP_CONCAT(rs.payment_status) AS payment_status
, s.id AS s_id
, s.file_number
, s.company_id
, s.travel_start_date
, s.travel_region
, s.country
, s.lead_name
, c.id
, c.name AS company
, c.currency_sign
, c.currency_code
, CASE WHEN SUM(rs.amount_recieved) = SUM(rs.amount_payable) 
     THEN "Paid"
     WHEN SUM(rs.amount_recieved) = 0 
     THEN "Not Paid"
     WHEN SUM(rs.amount_recieved) > 0 AND SUM(rs.amount_recieved) < SUM(rs.amount_payable) 
     THEN "Part paid"
     WHEN SUM(rs.amount_recieved) > SUM(rs.amount_payable) 
      THEN "Overpaid"
      ELSE "Error" END AS pm_status   
  FROM  erp_revenue_schedule rs
  JOIN erp_sales s
      ON s.id = rs.sales_id
  JOIN erp_company c
      ON c.id = s.company_id  
WHERE  rs.is_active = 1 
   AND s.is_active = 1 
   AND c.is_active = 1  
   AND pm_status = 'Not paid'  
 ORDER 
    BY rs.id   asc  
 LIMIT 0 ,10  

标签: mysqlfiltercase-when

解决方案


当您在选择中有普通列和聚合函数时,您需要使用GROUP BY,而不是DISTINCT.

此外,CASE如果您只想要具有SUM(rs.amount_recieved) = 0. 具有聚合函数的条件进入 -HAVING子句,而不是WHERE.


推荐阅读