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

SQL分块对表执行pivot:按ID分组行转列是否需用大量CASE WHEN

数据库行转列(Pivot)实现方案

结论

不需要手动编写大量CASE WHEN语句,可以根据你使用的数据库类型选择更简洁的实现方式:

  • 支持原生PIVOT语法的数据库,直接调用原生关键字即可完成转换
  • 不支持原生PIVOT的数据库,可通过动态SQL自动生成转换逻辑,无需手动逐个规则编码

具体实现参考

1. 原生PIVOT语法实现(适用于SQL Server、Oracle、PostgreSQL 15+、Spark SQL等支持原生PIVOT的数据库,以SQL Server为例)

SELECT 
  Chart_ID,
  'R1' AS R1, [R1] AS Action1, 
  'R2' AS R2, [R2] AS Action2,
  'R3' AS R3, [R3] AS Action3,
  'R4' AS R4, [R4] AS Action4
FROM (
  SELECT Chart_ID, Rule, Action 
  FROM 原始表
) AS SourceTable
PIVOT (
  MAX(Action)
  FOR Rule IN ([R1], [R2], [R3], [R4])
) AS PivotTable

2. 动态SQL实现(兼容无原生PIVOT的场景,以MySQL为例)

无需手动枚举所有Rule,代码会自动读取现有规则生成转换逻辑,后续新增R4、R5等规则时也无需修改代码,可自动适配新增的规则列:

SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
  CONCAT(
    'MAX(CASE WHEN Rule = ''', Rule, ''' THEN ''', Rule, ''' END) AS ', Rule, ', ',
    'MAX(CASE WHEN Rule = ''', Rule, ''' THEN Action END) AS Action', RIGHT(Rule, 1)
  )
) INTO @sql
FROM 原始表;

SET @sql = CONCAT('SELECT Chart_ID, ', @sql, ' FROM 原始表 GROUP BY Chart_ID');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 15:36:02