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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:07:16