SQL Pivot函数相关脚本触发语法报错问题咨询
SQL PIVOT 脚本错误排查结果
语法错误项
- 括号未闭合:
PIVOT函数的外层左括号未匹配对应右括号,原代码中IN列表的右括号结束后直接声明了AS pvt,缺少PIVOT本身的闭合右括号。 - 最外层子查询缺少别名:最外层
FROM ()包裹的子查询结束后未指定别名,绝大多数关系型数据库要求所有派生表必须声明别名。 - 分组字段不匹配:内层聚合的
GROUP BY子句使用了原始表字段p.prd_desc,而非你通过CASE语句生成的别名prd_desc,会导致同个分类下因原始产品描述不同被拆分为多条数据,不符合透视逻辑。 - PIVOT IN 列表与上游输出不匹配:上游
CASE语句仅会返回BBOM、BES、BIS、MainPlanMRC4 种枚举值,但原代码 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
相关产品推荐
相关产品推荐

