mysql - 仅在满足所有 CASE 语句条件时才显示行
问题描述
CREATE TABLE sales (
id int primary key,
campaign VARCHAR(255),
date_offered VARCHAR (255),
date_sold VARCHAR (255),
quantity_offered VARCHAR(255),
quantity_sold VARCHAR(255),
value_offered VARCHAR(255),
value_sold VARCHAR(255)
);
INSERT INTO sales
(id, campaign,
date_offered, date_sold,
quantity_offered, quantity_sold,
value_offered, value_sold
)
VALUES
("1", "C001", "2019-02-06", "2019-02-10", "500", "600", "4000", "4800"),
("2", "C002", "2019-04-15", "2019-04-12", "400", "800", "3200", "6400"),
("3", "C003", "2019-06-23", "2019-03-19", "650", "700", "5200", "5600"),
("4", "C004", "2019-08-09", "2019-08-22", "250", "150", "1750", "1050"),
("5", "C005", "2019-11-12", "2020-01-15", "860", "450", "6020", "3150"),
("6", "C006", "2020-01-30", "2019-12-18", "130", "280", "1170", "2520"),
("7", "C007", "2020-02-17", "2019-11-23", "470", "400", "4230", "3600");
上表中有几个错误,我CASE
在此查询中的语句中发现了这些错误:
SELECT
id,
campaign,
(CASE WHEN DATE(date_offered) > DATE(date_sold) THEN "Error" ELSE "OK" END) AS Check_Date,
(CASE WHEN SUM(quantity_offered) < SUM(quantity_sold) THEN "Error" ELSE "OK" END) AS Check_Quantity,
(CASE WHEN SUM(value_offered)/SUM(quantity_offered) > 10 THEN "Error" ELSE "OK" END) AS Check_Price_01,
(CASE WHEN SUM(value_sold)/SUM(quantity_sold) > 7 THEN "Error" ELSE "OK" END) AS Check_Price_02
FROM sales
GROUP BY 1;
所有这一切都完全按照我需要的方式工作。
现在,我想修改result
查询的,以便结果中只保留至少包含一个错误rows
的查询。
如果所有值都正常,则不应显示:row
id campaign Check_Date Check_Quantity Check_Price_01 Check_Price_02
1 C001 OK Error OK Error
2 C002 Error Error OK Error
3 C003 Error Error OK Error
6 C006 Error Error OK Error
7 C007 Error OK OK Error
我必须如何更改我的查询才能实现这一目标?
解决方案
只需使用该HAVING
子句。
SELECT
id,
campaign,
(CASE WHEN DATE(date_offered) > DATE(date_sold) THEN "Error" ELSE "OK" END) AS Check_Date,
(CASE WHEN SUM(quantity_offered) < SUM(quantity_sold) THEN "Error" ELSE "OK" END) AS Check_Quantity,
(CASE WHEN SUM(value_offered)/SUM(quantity_offered) > 10 THEN "Error" ELSE "OK" END) AS Check_Price_01,
(CASE WHEN SUM(value_sold)/SUM(quantity_sold) > 7 THEN "Error" ELSE "OK" END) AS Check_Price_01
FROM sales
GROUP BY 1
HAVING Check_Date = "Error"
OR Check_Quantity = "Error"
...
;
推荐阅读
- python - 使用布尔值查找两个列表之间的项目匹配并创建字典
- c++ - 具有仅显示偶数的显示功能的循环队列
- selenium - Selenium(Java)没有识别只有div元素的表中的某些元素
- c# - 使用 C# Nunit 捕获异常并声明它
- java - 错误:无法找到或加载主类 C:.Program 原因:java.lang.ClassNotFoundException:C:.Program java11、intellij IDEA 和 javafx 11
- amazon-web-services - 对filebeat AWS支持感到困惑
- javascript - 在javascript中按数字选择每个ID
- vue.js - vue.js vue-gl 在组件中缺少道具相机
- javascript - 使用匿名坐标数组移动多个 Dom 元素
- r - 在 R 中添加第二个 y 轴