之前我已经写过行转列的文章可参考https://www.cnblogs.com/heisenburg/p/11624836.html
其他形式的行转列
上面的文章中行专列的情形是players字段的数据类型为整数,如果字段数据类型为string类型的话,sum函数肯定是用不了了,那么怎么办呢?
这种问题其实数据库的开发者们早就想到了,而且有解决方案了。解决方案就是string_agg(),针对字符串类型的聚合函数。
如果有如下数据:
需要转换成如下形式:
按照之前篇的方法,只要把sum()换成字符串聚合函数就行了,所以可以如下写:
<style></style>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]) 函数。
以上,希望能帮到大家!