当前位置:   article > 正文

建议收藏丨sql行转列的一千种写法!!(1),阿里巴巴大厂面试参考指南_行转列 sql

行转列 sql

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
img

正文

SELECT *

FROM student

PIVOT (

SUM(score) FOR subject IN (语文, 数学, 英语)

) #默认按照score和subject以外其它字段进行group by

结果展示

2.2 经典case when实现

使用case when来依条件分列是最简单的一种方法。

select 学生号,

sum(case 科目 when ‘语文’ then 成绩 end) as 语文,

sum(case 科目 when ‘数学’ then 成绩 end) as 数学,

from table

where …

group by 学生号

case when进阶,动态列数行转列:

但是,转换后列数不固定的情况下呢?对照上面的例子来说就是,假设我并不知道学生学了哪些科目的时候应该怎么做?

我们继续用case when,但是由于列的不固定,需要先根据条件分支产生的可能性来拼接一下语句再动态执行。直接上码看效果可能更清晰一点:

declare @sql varchar(4000)

set @sql = ‘select 学生号’

select @sql = @sql + ‘,sum(case 科目 when ‘’’+科目+‘’’ then  成绩 end) [‘+科目+’]’

from (select distinct 科目 from table  ) as a

order by 科目

select @sql = @sql+’ from table  group by 学生号’

–print @sql

exec(@sql)

2.3 Python groupby 实现列转行

df_new = df_new.groupby(by=‘电影名’, as_index=False).agg(“/”.join)

print(df_new)

2.4 Python pandas 实现列转行

import pandas as pd

df = pd.DataFrame([[‘夏洛特烦恼’,‘沈腾/马丽/尹正/艾伦/王智’],

[‘缝纫机乐队’,‘大鹏/乔杉/古力娜扎/李鸿其/韩童生’]],

columns=[‘电影名’,‘部分演员’])

print(df)

根据’/'拆分为列表

df[‘部分演员’] = df[‘部分演员’].str.split(“/”) # 转成列表

print(df)

df_new = df.explode(‘部分演员’)

print(df_new)

2.5 execl 数据透视表实现行转列

Excel 要实现行列转换,需要用到 Power Query,而Power Query 只有Excel 2016以上的版本才有!

第一步,【Ctrl A 全选数据】-【数据】-【从表格】,创建 Power Query,进入 Power Query界面。

第二步,添加辅助列。Excel 实现列转换,可以通过【添加辅助列】来实现该效果。而在 Power Query 有多种可以添加辅助列的方法。此处介绍两种方法法一,通过自定义列,添加辅助列法二,通过重复列,实现添加辅助列

第三步,进行透视列。【透视列】>【值列,自定义,选中需要透视的列】-【聚合值函数,选择不要聚合】-【确定】。

第四步,合并列。选中透视出来的列,右键,【合并列】-【自定义分隔符】-【确定】 。

最后,选中多余的列,删除!再进行【关闭并上载】。全部搞定!列转行后的数据

ps. execl实现的原文链接:https://zhuanlan.zhihu.com/p/315340716

2.6 Java 实现行转列

public class Row2Line {

public static void main(String[] args) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {

//你提供的对象列表,需要转换的原数据

List StudentGrandList = getStudentGrandList();

//实现行转列的算法

List<List> convertedTable = convert(StudentGrandList);

//打印转换后的集合,查看结果

print(convertedTable);

//剩下的可以根据实际需求,将转换好的集合传给前端、或随意处理

}

private static List<List> convert(List StudentGrandList)

throws IntrospectionException, IllegalAccessException, InvocationTargetException {//取得StudentGrand的属性,当然你也可以用list = {“id”, “name”, …}

Field[] declaredFields = StudentGrand.class.getDeclaredFields();

List<List> convertedTable = new ArrayList<List>();

//多少个属性表示多少行,遍历行

for (Field field : declaredFields) {

field.setAccessible(true);

ArrayList rowLine = new ArrayList();

//list多少个StudentGrand实体类表示有多少列,遍历列

for (int i = 0, size = StudentGrandList.size(); i < size; i++) {

//每一行的第一列对应StudentGrand字段名

//所以新table的第一列要设置为字段名

if(i == 0){

rowLine.add(field.getName());

}

//新table从第二列开始,某一列的某个值对应旧table第一列的某个字段

else{

StudentGrand StudentGrand = StudentGrandList.get(i);

String val = (String) field.get(StudentGrand);//grand为int会报错

System.out.println(val);

rowLine.add(val);

}

}

convertedTable.add(rowLine);

}

return convertedTable;

}

//测试用数据,实际应该从数据库查询,传过来的

private static List getStudentGrandList () {

List list = new ArrayList();

list.add(new StudentGrand(“001”, “toni”, “语文”, “98”));

list.add(new StudentGrand(“001”, “toni”, “数学”, “98”));

list.add(new StudentGrand(“001”, “toni”, “外语”, “98”));

list.add(new StudentGrand(“001”, “toni”, “体育”, “98”));

list.add(new StudentGrand(“006”, “amy”, “语文”, “98”));

list.add(new StudentGrand(“006”, “amy”, “数学”, “98”));

list.add(new StudentGrand(“006”, “amy”, “外语”, “98”));

list.add(new StudentGrand(“006”, “amy”, “体育”, “98”));

list.add(new StudentGrand(“003”, “安东尼”, “语文”, “98”));

list.add(new StudentGrand(“003”, “安东尼”, “数学”, “98”));

list.add(new StudentGrand(“003”, “安东尼”, “外语”, “98”));

list.add(new StudentGrand(“003”, “安东尼”, “体育”, “98”));

return list;

}

//打印查看结果

private static void print(List<List> convertedTable) {

//String json = JSONArray.formObject(convertedTable).toString();

for (List list : convertedTable) {

for (String string : list) {

System.out.print(string+" ");

}

System.out.println();

}

}

ps. java实现的原文链接:https://blog.csdn.net/LRXmrlirixing/article/details/100163550

2.7 hive sql实现行转列

使用函数:concat_ws(‘,’,collect_set(column))  压缩到一行,跟题目要求稍有差异。

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
[外链图片转存中…(img-hrBn04QP-1713586071075)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/654022
推荐阅读
相关标签
  

闽ICP备14008679号