无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;
关键说明
- 行号生成:用
ROW_NUMBER()窗口函数按cat_type分区,给每个类别下的name排序并分配行号。如果原表有主键(比如id),建议把ORDER BY name改成ORDER BY id,这样行号顺序完全匹配原表数据的插入/存储顺序,避免因name重复导致顺序混乱。 - 聚合函数选择:透视时用
MAX(name)或MIN(name)即可,因为每个row_num和cat_type的组合只会对应一条数据,聚合操作不会改变结果,只是满足PIVOT对聚合函数的要求。
内容的提问来源于stack exchange,提问作者catty_catto
相关产品推荐
相关产品推荐

