SQL面试——列转行,行转列

数据长这样

张三,大唐双龙传
李四,天下无贼
张三,神探狄仁杰
李四,霸王别姬
李四,霸王别姬
王五,机器人总动员
王五,放牛班的春天
王五,盗梦空间

多行转一行

使用cancat_ws(等同wm_concat )、collect_list、collect_set、sort_array
这些函数分别是哪个数据库的,分别有什么区别稍后补上。


-- group_concat
-- 使用group_concat,mysql
SELECT locus, GROUP_CONCAT(id) FROM info 
WHERE locus IN('AB086827','AF040764') GROUP BY locus

-- wm_concat
-- 相对应的是Oracle独有的wm_concat,一般搭配group by 使用。阿里中台亦可用

-- concat_ws
-- 使用给定的分隔符将多个输入字符串列连接到一个字符串列中
-- 这个方法在阿里中台亲测可用
-- 只不过注意ent_name, id1 两个都必须出现在group by之后
select ent_name, id1, concat_ws(',',collect_list(cons_no)) as cons_no 
from power_data_day
GROUP BY ent_name, id1;

-- concat_ws的另一个用法是将hive的list或者array数据拼成string类型。hive中直接用cast转换list类型数据会报错。concat_ws(";",array_data) as 

-- collect_list
---使用逗号分隔,但是有中括号[]
select username, collect_list(video_name) 
from t_visit_video 
group by username ;

-- collect_set功能:聚合函数,返回去除重复元素后的集合
select username, id, collect_set(video_name) 
from t_visit_video 
where username is not null
group by username , id ;

-- sort_array功能:集合函数,对输入数组元素按升序或降序排序。空元素将按升序放在返回数组的开头,或按降序放在返回数组的末尾。

collect_set函数的搭配使用见下
https://blog.csdn.net/weixin_43597208/article/details/117450304

多行转一列

数据如图:
pref_name, sex, population
AA, 1, 100
AA, 2, 104

变成下面:
pref_name, M, F
AA, 100, 104
详细数据减附图1

select
	pref_name,
	sum( case when sex='1' then population else 0 end ) as cnt_M,
	sum( case when sex='0' then population else 0 end ) as cnt_F
from table1
group by pref_name
多列转一列

table_a和table_b,在下面的代码中其实是同一张表的不同筛选条件而已,甚至可以是同一张表。如此即可实现同一张表的不同的列,转成一列

select col1, col3 from table_a
union all
select col1, col2 from table_b
一行拆成多行
-- trans_array
-- 阿里中台


-- explode
-- 对数据格式有要求explode() takes an array or a map as a parameter
select explode(subs) as sub from employees ;


-- 如果是逗号分割的字符串等,使用下面代码

select app from specter.userapp_list 
lateral view explode(split(applist,',')) r1 AS app;
一行拆成多列
M列转换为N行

stack函数

附录

附图1
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
行转列是将长表转为宽表的过程,可以使用SQL语句中的SUM IF函数来实现。[1] SUM IF函数可以将符合某个条件的值进行求和,并将结果作为新的列。行转列的思路是将原表中的行记录变为多行,将列字段变为单列。实现的方法是首先根据某个条件进行筛选,然后使用SUM IF函数对符合条件的值进行求和,将结果作为新的列添加到宽表中。 列转行行转列的逆过程,即将宽表转为长表。 在SQL语句中,可以使用UNION操作符将多个查询结果合并为一个结果集。对于列转行的实现,可以针对每个列字段提取一张衍生表,然后使用UNION将所有衍生表合并到一起。需要注意的是字段的对齐,确保每个衍生表中的字段一一对应。 另外,还可以使用GROUP_CONCAT函数来实现列转行。该函数可以将同一组的行合并为一个字段,并返回合并后的结果。分组是根据GROUP BY指定的列进行的,通过指定要返回的列,可以将多个列字段合并为一个字段,实现列转行的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SQL 行转列列转行](https://blog.csdn.net/qq_52825422/article/details/125612013)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [sql查询:行转列列转行](https://blog.csdn.net/weixin_40482816/article/details/109395069)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值