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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:06:05