SQL ----- 多对多查询 和 行转列

构建多对多关联大致有两种方式:

  一种是借助第三方表记录两者主键进行关联,

  另一种是通过增加表中字段,通过分隔符分隔记录关联表的信息

查询的时候注意 使用限定,通过表名,列名

其中转化的话 可以参考之前写的 convert 转化

 

 将上述行转列,查看学生关注的岗位

小计一下:

-- 行转列  子查询、分组查询 和 case -when 结合使用
--注意 聚合函数max()不仅可以作用于数值类型的数据,还可以作用于字符串类型数据和日期时间类型的数据。而sum(),只是作用于数值类型数据,用于返回指定数据的和,空值会被默认忽略
--  查询表中的字段为子查询 as 的字段 
select 
tbSG.学生姓名 '学生姓名',
max(case tbSG.岗位名称 when '22' then '理发' else '0' end) '关注1',
max(case tbSG.岗位名称 when '09' then '厨师' else '0' end) '关注2',
max(case tbSG.岗位名称 when '通天塔' then '美容' else '0' end) '关注3',
max(case tbSG.岗位名称 when '11' then '按摩' else '0' end) '关注4'
from (

-- 子查询的内容为 多对多查询的内容
select     
     tbStudent.StuMark as 学号,
     tbStudent.StuName as 学生姓名,
     tbStudent.StuMobile as 学生手机号,
     tbUGongSiGangWei.GongSi_Name as 公司名称,      
     tbUGongSiGangWei.GangWei_Name as 岗位名称,
     tbUGongSiGangWei.GangWei_UserSum as 招聘数量,
     tbUGongSiGangWei.GongSi_4001_Name as 所在地区,
     tbUGongSiGangWei.GongSi_Address as 公司地址,
     tbUGongSiGangWei.GongSi_Tel as 联系人手机号,
     tbUGongSiGangWei.GongSi_User as 联系人,
     convert(varchar(50),tbUGongSiGangWei_Student.CreateTime,23) as 关注时间 
from tbUGongSiGangWei,tbStudent,tbUGongSiGangWei_Student 

where tbUGongSiGangWei.GongSiGuid = tbUGongSiGangWei_Student.GongSiGuid 
and   tbStudent.StudentGuid = tbUGongSiGangWei_Student.StudentGuid

) tbSG
-- 通过学生姓名进行分组展示
group by tbSG.学生姓名
原文地址:https://www.cnblogs.com/obge/p/13722463.html