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

无ID/键列时按行号实现列转行的SQL查询问题求助

问题分析与解决方案

你的查询核心问题是缺少分组依据,且误用了聚合函数STRING_AGG:

  • 未指定分组键时,PIVOT会将全表视为一个分组,STRING_AGG(name)自然会把同cat_type下的所有name合并成单个字符串。
  • 你需要的是按“每个类别内的行号”分组,让不同类别下的同序号name处于同一行,这就需要先给每个cat_type分组内的name分配独立行号,再基于行号做透视。

修正后的SQL查询

WITH numbered_cats AS (
  SELECT 
    name,
    cat_type,
    -- 按cat_type分区,给每个分组内的name分配行号,ORDER BY可根据实际需求调整(比如用主键id保证顺序稳定)
    ROW_NUMBER() OVER (PARTITION BY cat_type ORDER BY name) AS row_num
  FROM my_table
)
SELECT 
  row_num,
  Dom,
  Anggora,
  Turk,
  Persian
FROM numbered_cats
PIVOT(
  -- 每个row_num+cat_type组合仅对应一个name,用MAX/MIN均可
  MAX(name) FOR cat_type IN ('Dom' AS Dom, 'Anggora' AS Anggora, 'Turk' AS Turk, 'Persian' AS Persian)
) AS pivoted_result;

关键说明

  1. 行号生成:用ROW_NUMBER()窗口函数按cat_type分区,给每个类别下的name排序并分配行号。如果原表有主键(比如id),建议把ORDER BY name改成ORDER BY id,这样行号顺序完全匹配原表数据的插入/存储顺序,避免因name重复导致顺序混乱。
  2. 聚合函数选择:透视时用MAX(name)或MIN(name)即可,因为每个row_num和cat_type的组合只会对应一条数据,聚合操作不会改变结果,只是满足PIVOT对聚合函数的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 16:43:17