SQL计算列:如何用CASE条件汇总含指定多个单词的行
用CASE条件语句实现多单词匹配并汇总数据
嘿,这个需求我之前做销售报表的时候刚好遇到过,用CASE配合聚合函数就能完美解决。我给你拆解下具体怎么操作,分场景给你举例子,你一看就懂。
基础思路
核心逻辑是:先用CASE语句标记出符合条件(包含目标单词)的行,再用SUM/COUNT这类聚合函数对标记后的行做汇总。根据你是要合并汇总多个单词,还是分别汇总每个单词,写法略有不同。
场景1:把多个单词归为同一类别,合并汇总
比如你有一个orders表,想把包含“笔记本”或“台式机”的订单归为「电脑类」,然后汇总它们的总销售额,其他订单归为「其他类」。代码可以这么写:
SELECT -- 用CASE标记类别 CASE -- 匹配多个单词,用OR连接 WHEN product_description LIKE '%笔记本%' OR product_description LIKE '%台式机%' THEN '电脑类产品' ELSE '其他产品' END AS product_category, -- 对符合类别的行汇总销售额 SUM(sales_amount) AS total_sales, COUNT(*) AS order_count FROM orders -- 按标记的类别分组汇总 GROUP BY product_category;
这里要注意:
- 如果你需要模糊匹配(比如字段里包含目标单词就行),用
LIKE '%关键词%';如果是精确匹配(字段值完全等于某个关键词),直接用= '关键词',多个精确匹配可以用IN ('词1', '词2')更高效。 - 部分数据库(比如PostgreSQL)的LIKE是区分大小写的,如果你不区分大小写,可以用
LOWER(product_description) LIKE '%laptop%'统一转成小写再匹配。
场景2:分别汇总每个单词对应的数值
如果要单独统计“笔记本”和“台式机”各自的销售额,不需要合并类别,可以把CASE嵌套在SUM里面:
SELECT -- 只汇总包含“笔记本”的行的销售额 SUM(CASE WHEN product_description LIKE '%笔记本%' THEN sales_amount ELSE 0 END) AS laptop_sales, -- 只汇总包含“台式机”的行的销售额 SUM(CASE WHEN product_description LIKE '%台式机%' THEN sales_amount ELSE 0 END) AS desktop_sales, -- 汇总不属于以上两类的销售额 SUM(CASE WHEN product_description NOT LIKE '%笔记本%' AND product_description NOT LIKE '%台式机%' THEN sales_amount ELSE 0 END) AS other_sales FROM orders;
这个写法的好处是,一行SQL就能输出所有类别汇总结果,不用分组,适合做总览报表。
补充:精确匹配的简化写法
如果你的需求是精确匹配字段值等于多个关键词中的一个(比如product_type字段直接是“笔记本”或“台式机”),可以不用CASE,直接用WHERE过滤后分组汇总,更高效:
SELECT product_type, SUM(sales_amount) AS total_sales FROM orders WHERE product_type IN ('笔记本', '台式机') GROUP BY product_type;
这种写法比CASE更简洁,数据库执行效率也更高,能满足需求的话优先用这个。
内容的提问来源于stack exchange,提问作者Jonathan Livingston Seagull




