SQL学习之数据转换--行列转换_2

之前我已经写过行转列的文章可参考https://www.cnblogs.com/heisenburg/p/11624836.html

其他形式的行转列

    上面的文章中行专列的情形是players字段的数据类型为整数,如果字段数据类型为string类型的话,sum函数肯定是用不了了,那么怎么办呢?

这种问题其实数据库的开发者们早就想到了,而且有解决方案了。解决方案就是string_agg(),针对字符串类型的聚合函数。

如果有如下数据:

    需要转换成如下形式:

按照之前篇的方法,只要把sum()换成字符串聚合函数就行了,所以可以如下写:

SELECT 
name,
string_agg(case when course='语文' then grade else '' end,'') as "语文",
string_agg(case when course='数学' then grade else '' end,'') as "数学",
string_agg(case when course='英语' then grade else '' end,'') as "英语"
from
dw_temp.score
group by name;

如果老板又有要求格式改成这样的:

 又当如何呢,还是用string_agg即可实现:

SELECT 
name,
string_agg(grade,',') as "grade"
from
dw_temp.score
group by name;

如上两种形式的行转列的关键还是字符串的聚合函数,所以只要有了string_agg(field,[separator])就很容易实现了,这是postgre数据库中的函数,

如果使用的是mysql则有group_concat(Field,[separator]) 函数。

以上,希望能帮到大家!

posted @ 2019-12-30 21:46  Hansenburg  阅读(220)  评论(0编辑  收藏  举报