如何用SQL查询返回各字段名及其对应的求和值?
当然可以实现!分两种方案给你参考,看哪种更适合你的情况:
方案一:手动编写(适合字段数量固定的场景)
因为你提到只有约20个字段,手动写其实很直接,而且兼容性极强,所有SQL数据库都支持。核心思路是用UNION ALL把每个字段的名称和求和结果拼接成多行数据:
SELECT 'field1' AS field_name, SUM(field1) AS field_sum FROM your_table UNION ALL SELECT 'field2' AS field_name, SUM(field2) AS field_sum FROM your_table UNION ALL SELECT 'field3' AS field_name, SUM(field3) AS field_sum FROM your_table -- 依次添加剩下的field4到fieldN,直到所有需要求和的字段都写完
这个方法的好处是直观,不用依赖系统表,也不会有动态SQL的权限问题,写起来几分钟就能搞定20个字段。
方案二:动态生成SQL(适合字段可能变动的场景)
如果以后字段可能增减,不想每次都修改SQL,可以通过查询数据库的系统元数据表,动态生成求和语句。不同数据库的语法略有差异,下面给几个主流数据库的实现:
MySQL/MariaDB
SET @sql = NULL; SELECT GROUP_CONCAT( CONCAT("SELECT '", column_name, "' AS field_name, SUM(", column_name, ") AS field_sum FROM your_table") SEPARATOR ' UNION ALL ' ) INTO @sql FROM information_schema.columns WHERE table_schema = '你的数据库名' AND table_name = '你的表名' AND column_name NOT IN ('date', 'employee_id'); -- 排除不需要求和的字段 PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
PostgreSQL
DO $$ DECLARE sql TEXT; BEGIN SELECT string_agg( format('SELECT %L AS field_name, SUM(%I) AS field_sum FROM your_table', column_name, column_name), ' UNION ALL ' ) INTO sql FROM information_schema.columns WHERE table_schema = 'public' -- 你的表所在的schema,通常是public AND table_name = '你的表名' AND column_name NOT IN ('date', 'employee_id'); EXECUTE sql; END $$;
SQL Server
DECLARE @sql NVARCHAR(MAX); SELECT @sql = STRING_AGG( CONCAT(N'SELECT ''', column_name, ''' AS field_name, SUM(', column_name, ') AS field_sum FROM your_table'), N' UNION ALL ' ) FROM information_schema.columns WHERE table_schema = 'dbo' -- 你的表所在的schema,通常是dbo AND table_name = '你的表名' AND column_name NOT IN ('date', 'employee_id'); EXEC sp_executesql @sql;
动态方案的好处是字段变动时无需修改代码,但需要你有查询系统元数据表的权限,而且不同数据库的语法不能通用。
内容的提问来源于stack exchange,提问作者ruda




