You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计多列含指定文本的行数?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:43:12