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

MySQL员工账单场景硬编码行转列改造为动态自动列的技术咨询

MySQL 动态行转列实现方案

实现逻辑

通过MySQL预处理语句机制,自动读取账单类别配置表的全部分类,动态拼接聚合查询逻辑,新增账单类别后无需修改SQL即可自动生成对应结果列。

可直接运行代码

-- 可选:如果账单分类数量多,先调整GROUP_CONCAT长度限制,避免拼接截断
SET SESSION group_concat_max_len = 102400;

-- 1. 动态拼接所有分类对应的CASE聚合语句
SET @dynamic_case = NULL;
SELECT GROUP_CONCAT(DISTINCT
           CONCAT('SUM(CASE WHEN uc.c_name = ''', c_name, ''' THEN uc.c_amount ELSE NULL END) AS `', REPLACE(c_name, ' ', '_'), '`')
       ) INTO @dynamic_case
FROM app_fd_pr_uagecateg_bil;

-- 2. 组装完整查询SQL
SET @final_sql = CONCAT('
SELECT CONCAT(e.c_firstName, '' '', e.c_Lastname) AS NAME,
', @dynamic_case, '
FROM app_fd_pr_uage_bill ub 
INNER JOIN app_fd_pr_uagecateg_bil uc ON ub.id = uc.c_FrKeyUbill
INNER JOIN app_fd_hrm_employee e ON ub.c_employeeName = e.id
GROUP BY NAME
');

-- 3. 预处理并执行查询
PREPARE run_stmt FROM @final_sql;
EXECUTE run_stmt;
DEALLOCATE PREPARE run_stmt;

注意说明

  • 代码可直接在HeidiSQL中运行,输出逻辑和你原有的硬编码查询完全一致
  • 列名生成时自动将分类名称中的空格替换为下划线,符合MySQL列名规范,若需要自定义列名规则可修改REPLACE(c_name, ' ', '_')部分的逻辑
  • 若账单分类数量超过100个,可按需调大group_concat_max_len的参数值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:27:02