sql将查询结果行转列

行转列即把多行内容合并到一行显示

  1. oracle的行聚合函数

    listagg(要合并的字段,‘分隔符’) within group (order by 排序字段)

    --有一学生表student(班级号classId,分组号groupId,学号studentId,姓名name)
    --构造表:
    create table student(classId varchar(5),groupId varchar(5),studentId varchar(10),name varchar(10))
    insert into student
           SELECT '一班','1组','200','程长新' from dual
           union all
           SELECT '一班','1组','201','李丽云' from dual
           union all
           SELECT '一班','2组','202','程' from dual
           union all
           SELECT '一班','2组','203','长' from dual
           union all
           SELECT '一班','3组','204','新' from dual
    --现在要查看每一组所有的学生,并要求将一个组中的学生放在一行展示,学生之间用逗号隔开
    select 
    	groupId,
    	listagg(name,',') within group(order by 学号studentId) students
    from student 
    group by groupid
    --结果------------------------
    1组	程长新,李丽云
    2组	程,长
    3组	新
    

    如上,这是listagg作为聚合函数使用,每组返回一行结果

    listagg还可以作为分析函数使用,每一条记录返回一个结果

    select 
    	groupId,
    	studentid,
    	listagg(name,',') within group(order by studentId) over(partition by groupid) students 
    from student
    --结果------------------------
    1200	程长新,李丽云
    1201	程长新,李丽云
    2202	程,长
    2203	程,长
    3204
  2. mysql的行聚合函数

    group_concat(要合并的字段1,拼接的字段2,字段3...)

    有下表

现要求查询每个学生都选了哪些课程,要求课程在一行显示

select ctea_name,group_concat(course_name) courses from class_course group by ctea_name
--结果-----------
侯书田	操作系统
程长新	算法分析与设计,Oracle,SqlServer
肖浩萍	java基础,JSP,软件工程,计算机专业英语

又要求要同时展示课程号

select ctea_name,group_concat(course_id,':',course_name) courses from class_course group by ctea_name
--结果-------------
侯书田	0006:操作系统
程长新	0003:算法分析与设计,0004:Oracle,0005:SqlServer
肖浩萍	0000:java基础,0001:JSP,0002:软件工程,0007:计算机专业英语
posted @   程长新  阅读(805)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示