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

无需罗列大量列,使用COUNT()编写查询统计单行数值的方法

问题解答

首先明确:COUNT() 函数的作用是统计非空值的个数,如果按你给出的示例结果来看,你需要的是按行累加所有BOX列的数值、自动忽略NULL值,这类求和场景用SUM()函数更适配。以下是无需逐个罗列50+列就能实现的方案:

  • 如果你确实需要用COUNT(),只能统计每个PartNumber对应有值的BOX列总数,和你给出的示例结果不符,写法如下:
SELECT 
  PartNumber,
  COUNT(BOX1) + COUNT(BOX2) + COUNT(BOX3) + COUNT(BOX4) AS 有值BOX数量
FROM 你的表名
GROUP BY PartNumber
  • 如果你要实现示例中的数值求和效果,无需逐个列相加,不同数据库对应方案如下:

PostgreSQL 极简方案(完全不用罗列BOX列名)

只要你的BOX列命名符合统一前缀规则,直接批量识别求和:

SELECT PartNumber, 
       (SELECT SUM(value::numeric) 
        FROM json_each_text(to_jsonb(t)) 
        WHERE key LIKE 'BOX%') AS Total
FROM 你的表名 t;

SQL Server 方案

仅需要批量在VALUES中添加列名即可,不需要写复杂的相加逻辑,自动忽略NULL:

SELECT 
    PartNumber,
    BOX1, BOX2, BOX3, BOX4,
    (SELECT SUM(Val) FROM (VALUES (BOX1),(BOX2),(BOX3),(BOX4)) AS v(Val)) AS Total
FROM 你的表名

MySQL 动态拼接方案

自动读取所有BOX列拼接成求和语句,不用手动写列名:

SET @sql = (
    SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR ' + ')
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = '你的表名' 
    AND COLUMN_NAME LIKE 'BOX%'
);
SET @sql = CONCAT('SELECT PartNumber, BOX1, BOX2, BOX3, BOX4, ', @sql, ' AS Total FROM 你的表名');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

内容的提问来源于stack exchange,提问作者Jvang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:15:04