无需罗列大量列,使用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
相关产品推荐
相关产品推荐

