建议收藏丨sql行转列的一千种写法!!

大家好,我是明月十四桥!!

爱好特长:

1、爱好和特长有很多,擅长word、excel、ppt、wind等软件的安装与卸载;

2、精通PE、PS、PB、DCF、PEG等单词的拼写;

3、熟悉Windows、Linux、Mac、Android、IOS、WP8等系统的开关机。

今日重点:

   ① 花里胡哨、不择手段的sql写法;

   ② 一个深度回答,把面试官征服。

白天工作晚上写文,呕心沥血整理,有问题欢迎评论,点赞、收藏、评论是对我最大的支持!!!

目录

一 缘起

二 火花

2.1 内置函数实现行转列

2.2 经典case when实现

2.3 Python groupby 实现列转行

2.4 Python pandas 实现列转行

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

2.6 Java 实现行转列

2.7 hive sql实现行转列

2.8 Teradata UDF实现行转列

三 阑尾


一 缘起

在我们热爱的《数据仓库交流群》里发生了一幕:

:请教大佬们 这个咋搞?

              那9个字,犹如一声惊雷,在这个热情的群里炸开了锅...

:大佬们纷纷按奈不住(尤其是我),看不得别人有问题,我心急如焚,一是担心这位小哥哥面试受挫,二是这么好的学de习se的机会,我一定要把握住。。

大佬1: 这位来自上海的大佬,首先给出了orcale自带函数的解法...

 大佬2: 基于orcale自带函数的局限性,大佬2提出了适用于mysql、oracle、hive的case when写法...

 大佬3: hive 高级函数(花里胡哨起来了)...

 

问题

ps.哈哈哈哈,这不就是10次面试9次问的行转列嘛~

讨论过程中

大佬们纷纷谏言献策,集思广益。

 

二 火花

2.1 内置函数实现行转列

原理

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 pddf = 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<StudentGrand> StudentGrandList = getStudentGrandList();  //实现行转列的算法List<List<String>> convertedTable = convert(StudentGrandList);//打印转换后的集合,查看结果print(convertedTable);  //剩下的可以根据实际需求,将转换好的集合传给前端、或随意处理}  private static List<List<String>> convert(List<StudentGrand> StudentGrandList)  throws IntrospectionException, IllegalAccessException, InvocationTargetException {//取得StudentGrand的属性,当然你也可以用list = {"id", "name", ...}  Field[] declaredFields = StudentGrand.class.getDeclaredFields();List<List<String>> convertedTable = new ArrayList<List<String>>();  //多少个属性表示多少行,遍历行  for (Field field : declaredFields) {field.setAccessible(true);  ArrayList<String> rowLine = new ArrayList<String>();//list<T>多少个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<StudentGrand> getStudentGrandList () {  List<StudentGrand> list = new ArrayList<StudentGrand>();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<String>> convertedTable) {//String json = JSONArray.formObject(convertedTable).toString();for (List<String> 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))  压缩到一行,跟题目要求稍有差异。

select user_id,
concat_ws(',',collect_list(order_id)) as order_value 
from col_lie
group by user_id

2.8 Teradata UDF实现行转列

还是压缩到一行,不如case when的展示效果

REPLACE FUNCTION tdstats.UDFCONCAT(aVarchar VARCHAR(128) CHARACTER SET UNICODE)RETURNS VARCHAR(10000) CHARACTER SET UNICODECLASS AGGREGATE (20000)SPECIFIC udfConcatLANGUAGE CNO SQLNO EXTERNAL DATAPARAMETER STYLE SQLNOT DETERMINISTICCALLED ON NULL INPUTEXTERNAL NAME 'SL!staudf!F!udf_concatvarchar'

三 阑尾

剩下992种包含python、java、C, if else实现之类的方法,请大家自行脑补,欢迎在评论区发表你的高见~

 

求点赞、求评论、求收藏!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ORA-32004问题解决

问题描述&#xff1a; JSSSTR> startup force nomount;ORA-32004: obsolete and/or deprecated parameter(s) specifiedORACLE 例程已经启动 解决方法&#xff1a; 通过查看alter.log,并删除相应的值 上面提到的alert log文件位于%ORACLE_BASE%\admin\%ORACLE_SID%\bdump里。…

深度学习并非万能:你需要避免这三个坑

作者 | George Seif编译 | 专知整理 | Mandy, Sanglei摘要&#xff1a;本文是人工智能专家George Seif撰写的博文&#xff0c;介绍了在当前深度学习比较火热的情景下需要避免的三个坑。Tweaking Neural Net ParametersThree reasons that you should NOT use deep learning深度…

Redis配置文件常用配置消息解说--版本5.0.9

单位 配置文件中的uint单位对大小写不敏感 引用包 INCLUDES redis中也可以引用其他的配置文件。需要注意的是&#xff0c;在主从复制机制中&#xff0c;主机或哨兵的命令“CONFIG REWRITE”不会重写“include”选项。Redis总是使用最后处理的行作为配置指令的值&#xff0c;…

万字长文丨7个经典问题,助你拿下Java面试(建议收藏)

擅长领域&#xff1a;execl、word、ppt 等 今日重点&#xff1a; ① 掌握面试的基本素质&#xff1b; ② 学会7个典型的java面试问题。 有问题的小伙伴欢迎加我主页vx。评论、点赞、收藏是对我最大的支持&#xff01;&#xff01;&#xff01; 目录 一、面试的目的 二、面…

剑指 Offer 09. 用两个栈实现队列(相邻相同操作只需要移动一次)

题目 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 示例 1&#xff1a; 输入&#xff1a; …

应用人工智能有助心理学发展

来源&#xff1a; 中国社会科学报摘要&#xff1a;人工智能及相关技术的发展&#xff0c;为心理学研究提供了突破性的研究方法和工具&#xff1b;心理学对大脑机制的研究成果运用于人工智能领域&#xff0c;也推动着人工智能研究的进步。心理学同人工智能联系紧密&#xff0c;自…

【粉丝福利、免费领取】:1000套PPT模板、100份简历模板、硬核学习资料+PDF资料(java、python、大数据、机器学习)

目录 1、100套小编购买的简历模板&#xff08;部分截图&#xff09; 2、1000套精品PPT模板&#xff08;部分截图&#xff09; 3、大数据-学习资料&#xff08;1.3G 硬核PDF&#xff0c;官方指南&#xff09; 4、python学习全集 5、Java基础、高级和面试资料 6、大数据-行…

HDU 1142 A Walk Through the Forest dijkstra + DFS

http://acm.hdu.edu.cn/showproblem.php?pid1142 题意&#xff1a; Jimmy在位置 1 &#xff0c;每天晚上要回位置2&#xff08;家&#xff09;&#xff0c;计算1到2的最短距离&#xff0c;Jimmy要先去一个地方然后再回家&#xff0c;到了那个地方离家的距离不能大于1到2 的最短…

剑指 Offer 06. 从尾到头打印链表(递归、逆置链表、头部动态插入)

题目 输入一个链表的头节点&#xff0c;从尾到头反过来返回每个节点的值&#xff08;用数组返回&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,3,2] 输出&#xff1a;[2,3,1] 限制&#xff1a; 0 < 链表长度 < 10000 解法一&#xff1a;递归&#xff0…

王家耀院士 | 新型智慧城市“大脑”就是时空大数据平台

来源&#xff1a;泰伯网摘要&#xff1a;新型智慧城市建设的任务包括五点&#xff0c;首先是大力实施“互联网城市”行动&#xff1b;二要加强体制机制创新和城市资源整合&#xff1b;三要推进工业化、信息化、城镇化、农业现代化融合创新&#xff1b;四要着力解决“城市病”&a…

网站架构之缓存应用(摘录)

网站缓存这个话题并不新颖&#xff0c;但是能否将它用好&#xff0c;可是一门学问&#xff0c;同一件工具在不同人的手中会做出不同的事情来。这里我来分享总结下我对于网站架构中缓存应用的一些看法和经验&#xff0c;大家有好的想法可以补充 第一&#xff1a;缓存的一些基…

C++校招常见面试题(2019年校招总结)

总结了语法、数据结构、常见排序算法、操作系统、网络五大块常见校招面试题。欢迎补充与修正。 ★★语法知识★★ 一、C与C的区别 面向对象与面向过程的区别 面向过程 面向过程编程是就分析出解决问题题的步骤&#xff0c;然后把这些步骤一步一步的实现&#xff0c;使用的时…

3分钟了解物联网三大技术的未来争夺战!

来源&#xff1a;传感器技术摘要&#xff1a;物联网通过通信技术将人与物、物与物进行连接&#xff0c;在智能家居、工业数据采集等区域网通信场景一般采用短距离通信技术&#xff0c;对于广范围、远距离的连接则需要远距离通信技术。物联网通过通信技术将人与物、物与物进行连…

Socket一次Recv接受的字节有限制么?

答案是&#xff1a;有。大约 5-15KB &#xff0c;默认 具体 和什么有关系我也不知道。反正我测试的是&#xff1a;16371字节。win7 x64。 可以使用setSockOpt来设置 recvbuf or sndbuf 的大小&#xff0c;但是 我的建议还是控制 每次接受的字节数 控制在一定范围 比如 5KB。因为…

❤ 想知道大厂面试都问什么吗,附最强面试技巧!!(大数据开发岗)❤

作者简介 蓝桥签约作者、大数据&Python领域优质创作者。维护多个大数据技术群&#xff0c;帮助大学生就业和初级程序员解决工作难题。 我的使命与愿景&#xff1a;持续稳定输出&#xff0c;赋能中国技术社区蓬勃发展&#xff01; 粉丝福利&#xff1a;免费下载海量【PPT…

C++常见面试题(2019年校招总结)

一、C与C语言的联系 c语言是面向过程的结构化语言&#xff0c;c是面向对象的的程序设计语言&#xff0c;在c语言的基础上进行了扩充和完善&#xff0c;并且c兼容了c语言的面向过程的特点。在C中可以使用继承、多态进行面向对象的编程。 面向对象与面向过程的区别 面向过程 …

机器怎样才能有意识

来源&#xff1a;应行仁科学网博客摘要&#xff1a;意识&#xff0c;没有一个客观的科学定义&#xff0c;难以观测认定&#xff0c;但它是每个人都能主观感受到的真实。意识&#xff0c;没有一个客观的科学定义&#xff0c;难以观测认定&#xff0c;但它是每个人都能主观感受到…

OD使用教程3(下) - 调试篇03|解密系列

OD使用教程3(下) - 调试篇03 让编程改变世界 Change the world by program 逻辑运算 [caption id"attachment_706" align"aligncenter" width"358"]逻辑运算[/caption] 关于test指令 test指令格式&#xff1a;test dest, src 这个指令和…

❤『面试知识集锦100篇』1.面试技巧篇丨HR的小心思,你真的懂吗?

作者&#xff1a;不吃西红柿 简介&#xff1a;CSDN博客专家、蓝桥签约作者、大数据&Python领域优质创作者。 目录 一、企业考察要点 技巧一&#xff1a;了解自己的专业技能与 JD 中的匹配点 技巧二、把控好企业「味道」 技巧三、精彩的自我介绍 技巧四、常见问题回答…

剑指 Offer 03. 数组中重复的数字()

在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 解题思路 原地交换&#xff0c;让对应的数字放在对应位置…