mysql - 在 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
解决方案
当您在选择中有普通列和聚合函数时,您需要使用GROUP BY
,而不是DISTINCT
.
此外,CASE
如果您只想要具有SUM(rs.amount_recieved) = 0
. 具有聚合函数的条件进入 -HAVING
子句,而不是WHERE
.
推荐阅读
- python-3.x - Bigquery Python API 不支持数组
- django - 如何将我的对象保存在另一个表中?
- java - 为什么需要自定义异常类
- javascript - 如何在 ace 编辑器中启用每个关键事件的自动完成功能?
- javascript - 当 window.innerwidth 更改时,如何动态更改 html 表格(每行的项目数)布局?
- java - 周围建议中的 HttpServletResponse 为空,我做错了什么?
- python - 在 tensorflow 对象检测 API 中,有没有办法知道对象检测模型有多少参数?
- lua - love.textinput 在 Linux 上从未调用过 Love2d 11.1
- reactjs - 错误:(19, 35) TS2304:找不到名称“T”。为什么我不能在 TS 中扩展接口?
- sql - 为什么将日期从 nvarchar(max) 转换为日期会引发错误?