Teradata中如何将列值转置为列?动态SQL报错求助
解决Teradata动态行转列及语法错误问题
错误原因
出现[3706] Syntax error是因为Teradata中XMLAGG的排序语法使用错误,正确写法需将ORDER BY放在WITHIN GROUP()子句内,而非直接跟在XMLAGG()的括号之后。
修正后的动态SQL方案
步骤1:生成动态列的SQL片段
先修正XMLAGG语法,生成每个Model对应的聚合字段语句:
WITH unique_models AS ( SELECT DISTINCT MODEL FROM table_name WHERE STATUS IN ('A', 'P', 'F') -- 统一过滤条件,与后续查询保持一致 ), dynamic_cols AS ( SELECT TRIM(TRAILING ',' FROM ( XMLAGG( 'SUM(CASE WHEN MODEL = ''' || MODEL || ''' THEN 1 ELSE 0 END) AS ' || MODEL ORDER BY MODEL ASC ) WITHIN GROUP (ORDER BY MODEL ASC) -- Teradata XMLAGG排序的正确语法 )) AS col_list FROM unique_models ) SELECT 'WITH id_model_counts AS ( SELECT ID, ' || col_list || ' FROM table_name WHERE STATUS IN (''A'', ''P'', ''F'') GROUP BY ID ) SELECT t.ID, ' || col_list || ' FROM table_name t JOIN id_model_counts c ON t.ID = c.ID WHERE t.STATUS IN (''A'', ''P'', ''F'');' AS final_sql FROM dynamic_cols;
步骤2:执行动态生成的SQL
运行上述语句后,会得到最终可执行的SQL代码,直接执行该代码就能得到你期望的输出——每条原记录都会显示对应ID的各Model出现次数。
额外说明
- 原错误代码中
AC_STATUS与后续STATUS字段不一致,已统一为STATUS,请根据实际表结构调整字段名。 - 生成的SQL先统计每个ID的各Model次数(通过
id_model_counts公共表表达式),再与过滤后的原表关联,实现每条原记录重复显示统计值的需求。 - 动态生成的列名直接使用Model值(如
100、200),与你期望输出的列名完全匹配。
内容的提问来源于stack exchange,提问作者user21077255
相关产品推荐
相关产品推荐

