SQL多列求和后转置为行的无需unpivot实现方案咨询
实现方案
方案1:使用动态SQL自动生成求和语句(推荐,适配100+列场景)
不用手动枚举所有列名,直接从数据库元数据表读取列名自动拼接语句,无需手动处理100+列的编写工作量,不同数据库写法如下:
MySQL 实现
-- 1. 拼接生成查询SQL SET @sql = ( SELECT GROUP_CONCAT( 'SELECT ''', COLUMN_NAME, ''' AS variable, SUM(', COLUMN_NAME, ') AS sum_variable FROM 你的表名' SEPARATOR ' UNION ALL ' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '你的表名' AND TABLE_SCHEMA = '你的库名' -- 不需要求和的列可在此处过滤,例如:AND COLUMN_NAME NOT IN ('id','create_time') ); -- 2. 执行生成的SQL PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
PostgreSQL 实现
DO $$ DECLARE v_sql text; BEGIN -- 拼接SQL SELECT string_agg( format('SELECT %L AS variable, SUM(%I) AS sum_variable FROM 你的表名', column_name, column_name), ' UNION ALL ' ) INTO v_sql FROM information_schema.columns WHERE table_name = '你的表名' AND table_schema = 'public' -- 不需要求和的列可在此处过滤,例如:AND column_name NOT IN ('id','create_time') ; -- 打印生成的SQL RAISE NOTICE '%', v_sql; END $$; -- 复制上方打印的SQL单独执行即可得到结果
SQL Server 实现
DECLARE @sql NVARCHAR(MAX) SELECT @sql = STRING_AGG( 'SELECT ''' + COLUMN_NAME + ''' AS variable, SUM(' + QUOTENAME(COLUMN_NAME) + ') AS sum_variable FROM 你的表名', ' UNION ALL ' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '你的表名' AND TABLE_SCHEMA = 'dbo' -- 不需要求和的列可在此处过滤,例如:AND COLUMN_NAME NOT IN ('id','create_time') EXEC sp_executesql @sql
方案2:禁用动态SQL场景的简化写法
如果场景不允许使用动态SQL,可以用VALUES子句替代UNPIVOT,写法更简洁:
SELECT v.variable, SUM(v.sum_variable) AS sum_variable FROM 你的表名 t CROSS JOIN ( VALUES ('col1', t.col1), ('col2', t.col2), -- 100+列可通过Excel批量拼接生成该部分内容,不用手动逐行编写 ('colN', t.colN) ) v(variable, sum_variable) GROUP BY v.variable
该写法针对你给出的示例可完全输出匹配要求的结果。
内容的提问来源于stack exchange,提问作者user16228179
相关产品推荐
相关产品推荐

