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

SQL Pivot函数相关脚本触发语法报错问题咨询

SQL PIVOT 脚本错误排查结果

语法错误项

  • 括号未闭合:PIVOT 函数的外层左括号未匹配对应右括号,原代码中 IN 列表的右括号结束后直接声明了 AS pvt,缺少 PIVOT 本身的闭合右括号。
  • 最外层子查询缺少别名:最外层 FROM () 包裹的子查询结束后未指定别名,绝大多数关系型数据库要求所有派生表必须声明别名。
  • 分组字段不匹配:内层聚合的 GROUP BY 子句使用了原始表字段 p.prd_desc,而非你通过 CASE 语句生成的别名 prd_desc,会导致同个分类下因原始产品描述不同被拆分为多条数据,不符合透视逻辑。
  • PIVOT IN 列表与上游输出不匹配:上游 CASE 语句仅会返回 BBOM、BES、BIS、MainPlanMRC 4 种枚举值,但原代码 PIVOT 的 IN 列表中写了 16 种值,其余 12 种值不会有对应输出,部分严格校验的数据库会直接抛出语法错误。

逻辑错误项

  • 过滤条件失效:WHERE 子句中 Lower(t.desc_text) NOT LIKE '%bizsales%' OR Lower(t.desc_text) NOT LIKE '%bizseg%' 条件永远为真,等同于没有做该维度过滤,需将 OR 修改为 AND 才能实现「同时不包含两个关键词」的过滤需求。
  • 无效嵌套:原代码在 PIVOT 外层多套了一层仅做字段提取的子查询,无实际作用,可直接删除简化代码。

数据库适配提示

  • 若使用 SQL Server 环境,PIVOT 的 IN 列表中的枚举值不需要加单引号,需改为方括号包裹,例如 [BBOM] AS bbom_mrc。
  • 若使用 Oracle 环境,原代码 IN 列表的单引号写法符合语法要求。

修正后参考代码(Oracle 环境)

SELECT *
FROM (
    SELECT
        s.svc_no,
        m.month_yyyymm,
        Sum(r.mth_net_rentl_amt) mrc,
        CASE
            WHEN Upper(p.prd_desc) LIKE '%MOBILE%BROADBAND%' THEN 'BBOM'
            WHEN Upper(p.prd_desc) LIKE '% ENTERPRISE SOLUTION%' THEN 'BES'
            WHEN Upper(p.prd_desc) LIKE '% INT%' THEN 'BIS'
            ELSE 'MainPlanMRC'
        END prd_desc
    FROM tbl1 s
    JOIN tbl2 m ON m.subs_skey = s.subs_skey
    JOIN tbl3 r ON m.trkg_id = r.emf_trkg_id
    JOIN tbl4 p ON p.prd_skey = m.prd_skey
    JOIN tbl5 t ON t.lookup_cd = s.cust_clasfn_cd
    WHERE m.month_yyyymm = 202106
    AND s.end_dt = 99991231
    AND s.op_svc_type_id = 'MT'
    AND s.arbor_svc_type_id = '501'
    AND t.table_abbrev = 'CUST_CLASSIFICATION'
    AND (
        Lower(t.desc_text) NOT LIKE '%bizsales%'
        AND Lower(t.desc_text) NOT LIKE '%bizseg%'
    )
    AND (
        (
            Upper(p.prd_desc) LIKE '%MOBILE%BROADBAND%'
            OR Upper(p.prd_desc) LIKE '%ENTERPRISE SOLUTION%'
            OR Upper(p.prd_desc) LIKE '%INT%'
        )
        OR p.main_prd_ind = 1
    )
    GROUP BY
        s.svc_no,
        m.month_yyyymm,
        CASE
            WHEN Upper(p.prd_desc) LIKE '%MOBILE%BROADBAND%' THEN 'BBOM'
            WHEN Upper(p.prd_desc) LIKE '% ENTERPRISE SOLUTION%' THEN 'BES'
            WHEN Upper(p.prd_desc) LIKE '% INT%' THEN 'BIS'
            ELSE 'MainPlanMRC'
        END
) AS a 
PIVOT (
    Sum(mrc) FOR prd_desc IN (
        'BBOM' AS bbom_mrc,
        'BES' AS bes_mrc,
        'BIS' AS bis_mrc,
        'MainPlanMRC' AS mainplan_mrc
    )
) AS pvt;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:09:05