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

Oracle SQL中如何基于现有列筛选并生成目标新列?

Oracle SQL行转列实现自定义列名需求

原始表结构及数据

LEVELNAMEGDPEXP BCEXP CC
BAFF_B_BCORE88956.8367063.5115136.50
CAFF_C_CCORE84858.3600
JAFF_J_CCORE78115.3877177.7323501.13
BAFF_OTHER12740.9300
CAFF_OTHER11121.9300
JAFF_OTHER15762.4800

期望输出表结构及数据

GDP_B_BCOREGDP_C_CCOREGDP_J_JCOREEXP BCEXP CCEXP JC
88956.8384858.3678115.3867063.5115136.5077177.73

解决方案SQL

固定匹配写法(适合列名明确的场景)

SELECT
    SUM(CASE WHEN NAME = 'AFF_B_BCORE' THEN GDP END) AS GDP_B_BCORE,
    SUM(CASE WHEN NAME = 'AFF_C_CCORE' THEN GDP END) AS GDP_C_CCORE,
    SUM(CASE WHEN NAME = 'AFF_J_CCORE' THEN GDP END) AS GDP_J_JCORE,
    SUM(CASE WHEN LEVEL = 'B' THEN "EXP BC" END) AS "EXP BC",
    SUM(CASE WHEN LEVEL = 'B' THEN "EXP CC" END) AS "EXP CC",
    SUM(CASE WHEN LEVEL = 'J' THEN "EXP BC" END) AS "EXP JC"
FROM
    your_table_name
WHERE
    NAME NOT LIKE 'AFF_OTHER';

通用匹配写法(适合NAME格式固定的场景)

如果NAME遵循AFF_X_XCORE的格式,可用正则提取LEVEL部分,适配列名的小差异:

SELECT
    SUM(CASE WHEN REGEXP_SUBSTR(NAME, 'AFF_([A-Z])_([A-Z]+)CORE', 1, 1, 'i', 1) = 'B' THEN GDP END) AS GDP_B_BCORE,
    SUM(CASE WHEN REGEXP_SUBSTR(NAME, 'AFF_([A-Z])_([A-Z]+)CORE', 1, 1, 'i', 1) = 'C' THEN GDP END) AS GDP_C_CCORE,
    SUM(CASE WHEN REGEXP_SUBSTR(NAME, 'AFF_([A-Z])_([A-Z]+)CORE', 1, 1, 'i', 1) = 'J' THEN GDP END) AS GDP_J_JCORE,
    SUM(CASE WHEN LEVEL = 'B' THEN "EXP BC" END) AS "EXP BC",
    SUM(CASE WHEN LEVEL = 'B' THEN "EXP CC" END) AS "EXP CC",
    SUM(CASE WHEN LEVEL = 'J' THEN "EXP BC" END) AS "EXP JC"
FROM
    your_table_name
WHERE
    NAME LIKE 'AFF_%_CORE';

说明

  • 用SUM(CASE ...)实现行转列:CASE语句匹配指定条件返回对应值,不满足则返回NULL,SUM自动忽略NULL,最终得到目标列的唯一有效值。
  • 列名包含空格时(如EXP BC),需用双引号包裹(Oracle对特殊字符/空格列名的语法要求)。
  • 通过WHERE子句过滤AFF_OTHER记录,避免无关数据干扰计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:17:23