如何按指定列分组并实现行转列的表格结构转换?
按Year分组实现行转列的表格转换方案
SQL实现(以MySQL为例)
思路
先为每个年份的记录生成行号,再通过行号关联不同年份的数据,将年份转为列,对应月份缩写作为行内容。
代码示例
-- 处理原始数据,提取月份缩写并生成年份内的行序号 WITH year_month_data AS ( SELECT Year, LEFT(Month, 3) AS Month_Abbr, -- 提取月份前3位作为缩写 ROW_NUMBER() OVER (PARTITION BY Year ORDER BY Month) AS row_id FROM your_table -- 替换为你的实际表名 ) -- 按行号关联不同年份的数据,生成目标表格 SELECT y20.Month_Abbr AS `2020`, y21.Month_Abbr AS `2021` FROM (SELECT Month_Abbr, row_id FROM year_month_data WHERE Year = 2020) y20 FULL JOIN (SELECT Month_Abbr, row_id FROM year_month_data WHERE Year = 2021) y21 ON y20.row_id = y21.row_id;
说明
ROW_NUMBER()用于给每个年份内的记录按月份顺序编行号,确保同序号的记录能对齐到同一行。FULL JOIN会保留两个年份的所有行,若某一年份的行号对应另一年份无数据,对应位置会显示NULL,可根据需求用COALESCE替换为空字符串。- 其他数据库(如SQL Server、Oracle)语法类似,仅部分关键字可能有差异(如Oracle用
FULL OUTER JOIN)。
Excel实现
步骤
- 提取月份缩写:在空白列(如E列)输入公式
=LEFT(B2,3),下拉填充所有行,得到所有月份的前3位缩写。 - 设置目标表头:在G1单元格输入
2020,H1单元格输入2021。 - 生成各年份的月份列表:
- 选中G2单元格,输入数组公式:
=INDEX($E$2:$E$5, SMALL(IF($A$2:$A$5=G$1, ROW($A$2:$A$5)-ROW($A$2)+1), ROWS(G$2:G2))),按Ctrl+Shift+Enter确认输入,下拉填充直到出现#NUM!(表示该年份无更多数据)。 - 选中H2单元格,输入数组公式:
=INDEX($E$2:$E$5, SMALL(IF($A$2:$A$5=H$1, ROW($A$2:$A$5)-ROW($A$2)+1), ROWS(H$2:H2))),同样按Ctrl+Shift+Enter确认,下拉填充。
- 选中G2单元格,输入数组公式:
- 清理无效数据:将出现
#NUM!的单元格替换为空,即可得到目标表格结构。
内容的提问来源于stack exchange,提问作者giridaran l
相关产品推荐
相关产品推荐

