如何统计多列含指定文本的行数?SQL实现求助
解决方案:统计产品名称在多列中出现的记录数
单产品统计(以Microsoft为例)
直接通过字符串常量指定产品别名,筛选匹配行并统计,同时拼接备注信息:
SELECT 'Microsoft' AS Product, CONCAT(COUNT(*), '(一条为Outlook问题记录,另一条为其他产品的Word问题记录)') AS `number of records` FROM your_table_name -- 替换为你的实际表名 WHERE -- 匹配Product Name列等于Microsoft的行 `Product Name` = 'Microsoft' -- 匹配Issue描述中包含Microsoft的行(忽略大小写) OR LOWER(`Issue description`) LIKE '%microsoft%';
多产品批量统计
如果需要同时统计多个产品,用UNION ALL合并每个产品的统计结果:
-- 统计Microsoft SELECT 'Microsoft' AS Product, CONCAT(COUNT(*), '(一条为Outlook问题记录,另一条为其他产品的Word问题记录)') AS `number of records` FROM your_table_name WHERE `Product Name` = 'Microsoft' OR LOWER(`Issue description`) LIKE '%microsoft%' UNION ALL -- 统计Lenovo SELECT 'Lenovo' AS Product, CONCAT(COUNT(*), '(一条为Lenovo笔记本蓝屏记录)') AS `number of records` FROM your_table_name WHERE `Product Name` = 'Lenovo' OR LOWER(`Issue description`) LIKE '%lenovo%';
动态生成备注(无需硬编码描述)
如果不想手动写备注内容,可以通过子查询统计两种匹配场景的数量,自动生成说明:
SELECT 'Microsoft' AS Product, CONCAT( total_count, '(', product_match_count, '条为Product Name列匹配记录,', issue_match_count, '条为Issue description列跨产品匹配记录)' ) AS `number of records` FROM ( SELECT COUNT(*) AS total_count, -- 统计Product Name列直接匹配的数量 SUM(CASE WHEN `Product Name` = 'Microsoft' THEN 1 ELSE 0 END) AS product_match_count, -- 统计Issue描述包含但Product Name不匹配的数量 SUM(CASE WHEN LOWER(`Issue description`) LIKE '%microsoft%' AND `Product Name` != 'Microsoft' THEN 1 ELSE 0 END) AS issue_match_count FROM your_table_name WHERE `Product Name` = 'Microsoft' OR LOWER(`Issue description`) LIKE '%microsoft%' ) AS stats;
关于WITH子查询的问题
如果之前用WITH子查询失败,大概率是分组或匹配逻辑有误。可以用WITH预处理所有匹配行,再分组统计:
WITH product_matches AS ( SELECT CASE WHEN `Product Name` = 'Microsoft' OR LOWER(`Issue description`) LIKE '%microsoft%' THEN 'Microsoft' WHEN `Product Name` = 'Lenovo' OR LOWER(`Issue description`) LIKE '%lenovo%' THEN 'Lenovo' END AS Product FROM your_table_name WHERE -- 筛选所有可能匹配目标产品的行 `Product Name` IN ('Microsoft', 'Lenovo') OR LOWER(`Issue description`) LIKE '%microsoft%' OR LOWER(`Issue description`) LIKE '%lenovo%' ) SELECT Product, CONCAT(COUNT(*), CASE Product WHEN 'Microsoft' THEN '(一条为Outlook问题记录,另一条为其他产品的Word问题记录)' WHEN 'Lenovo' THEN '(一条为Lenovo笔记本蓝屏记录)' END ) AS `number of records` FROM product_matches WHERE Product IS NOT NULL -- 过滤掉不匹配任何目标产品的行 GROUP BY Product;
注意事项
- 替换
your_table_name为你的实际数据表名称 - 使用
LOWER()函数是为了忽略大小写匹配(比如Issue中的'microsoft'和'Microsoft'都能被识别) - 如果报表工具支持参数化,可以把产品名称设为参数,实现动态统计不同产品
内容的提问来源于stack exchange,提问作者Puneetha Sanjeeva Reddy
相关产品推荐
相关产品推荐

