建议收藏丨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,一经查实,立即删除!

相关文章

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

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

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

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

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

来源&#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;对于广范围、远距离的连接则需要远距离通信技术。物联网通过通信技术将人与物、物与物进行连…

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

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

机器怎样才能有意识

来源&#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 中的匹配点 技巧二、把控好企业「味道」 技巧三、精彩的自我介绍 技巧四、常见问题回答…

机器人行业发展方向预测报告

来源&#xff1a;招商证券摘要&#xff1a;随着中国人口红利消失&#xff0c;机器人不仅在制造业上正在替代工人&#xff0c;还将在军事、服务、娱乐等领域取代人类&#xff0c;“钢铁侠”已不仅仅存在于美国科幻电影中&#xff0c;而正走入我们的生活。本篇报告对机器人行业及…

在BingoCC上面解析域名实现智能路由

天朝的网络强大无人能及&#xff0c;世界上最大的Ping值不是从中国到美国而是从电信到联通。当你搭建了一个网站需要为南方北方的客户服务的话少不得你就要选择有中国特色的双线机房了。现在假如你已经把你的服务器已经部署在双线机房了&#xff0c;并且申请到了双线IP。为了让…

数据结构 - 队列(图解+源码)

队列 概念 队列是一种特殊的线性表&#xff0c;特殊之处在于它遵循先入先出&#xff08;FIFO&#xff09;原则&#xff0c;只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作&#xff0c;和栈一样…

学界 | 清华AMiner团队发布53页计算机图形学研究报告

来源&#xff1a;AI科技评论摘要&#xff1a;清华 AMiner 团队近日发布新一期研究报告——《计算机图形学研究报告》&#xff0c;报告全文共 53 页&#xff0c;从概念、技术、人才、会议、应用及相应趋势详细介绍了计算机图形学的相关内容。报告内容速览概述篇&#xff1a;计算…

爱犯错的智能体 – 视觉篇(五):火星人脸的阴影

来源&#xff1a;张军平科学网博客摘要&#xff1a;人类对外星文明的寻找和痴迷自古就有记载。所以&#xff0c;每每看到拍摄于外星球的照片&#xff0c;必然会情绪激动&#xff0c;试图从中获取存在外星人的蛛丝马迹。一、火星人脸人类对外星文明的寻找和痴迷自古就有记载。所…

链表简单实现(增删查改)

链表 关于链表的原理已经有一篇链表文章写的很详细了&#xff0c;这篇文章主要侧重于代码的实现&#xff0c;主要使用go实现。 单链表实现 package Listtype listNode struct {val intnext *listNode }func newNode(val int) *listNode {node : new(listNode)node.val val…