17年找数分工作,一个典型的SQL面试题就是行转列操作。这里介绍下一维数据的行转列与逆向操作,就Excel、SQL、Python给予示例。
示例数据集如下(包含三个字段:产品+月份+销售额):

行转列:展示不同产品(行)不同月份(列)的销售额
列转行:行转列的逆向操作,还原数据(行转列有聚合的情况无法还原)
Excel
- 行转列:使用透视表
表格选中数据范围
点击 插入 选项卡下面的 数据透视表,位置放到 新工作表 或者 现有工作表 点击确定

3. 将字段 product_name 拖至 行,dt_month 拖至 列,sales 拖至 值(如下图)。



- 列转行:使用Power Query逆透视功能
处理步骤如下(需office Excel2016及更新版本):
1. 创建表:选中表格数据区域,点击 数据 选项卡下的 来自表格/区域,弹窗点击确定

2. 逆透视:选中表格不需要转换的列(这里是产品名称),然后点击 转换 选项卡下的 逆透视其他列 即可完成逆透视操作。

结果如下:

点击Power Query 文件 选项卡的 关闭并上载 便可将数据写入到Excel表格中

SQL
行转列:需要枚举字段值
select product_name,sum(case when dt_month='1月' then sales else 0 end) as month1_sales,sum(case when dt_month='2月' then sales else 0 end) as month2_sales,sum(case when dt_month='3月' then sales else 0 end) as month3_salesfrom table_name -- 表名group by product_name
行转列:每个字段需要写一段union all
在行转列中,如果某个列没有值生成的值为0,sql中可按需踢掉。
select product_name,'month1_sales' as dt_month -- 这里需要转化为 1月,下同,month1_sales as salesfrom table_nameunion allselect product_name,'month2_sales' as dt_month,month1_sales as salesfrom table_nameunion allselect product_name,'month3_sales' as dt_month,month1_sales as salesfrom table_name
字段如果多,可以考虑用excel拼接sql,比如输入如下函数(使用textjoin拼接):
=TEXTJOIN(CHAR(10)&"union all "&CHAR(10),1,"select product_name, '" & B1:D1 & "' as dt_month," & B1:D1 & "as sales from table_name")

Python
行转列:groupby | pivot_table
# 读取数据import pandas as pddf = pd.read_excel("测试数据.xlsx")# 透视表,类似于excel透视表操作df1 = pd.pivot_table(df,index='product_name',columns='dt_month',values='sales',aggfunc='sum').reset_index()

df.groupby('product_name', as_index=False).agg(month1_sales=('sales', lambda x: x[df.loc[x.index, 'dt_month'] == '1月'].sum()),month2_sales=('sales', lambda x: x[df.loc[x.index, 'dt_month'] == '2月'].sum()),month3_sales=('sales', lambda x: x[df.loc[x.index, 'dt_month'] == '3月'].sum()))

列转行
df2 = pd.melt(df1,id_vars=['product_name'],value_vars=['1月','2月','3月'],var_name='dt_month',value_name='sales')

文章转载自数据打工人的自我修养,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




