求助,怎么把查询的结果插入到新建的表中

gzhosp_redAnt 2018-04-25 11:34:00
最近在做项目,老师的要求比较奇特,具体的看图吧,现在我们数据库有一个表:

然后我们要采取某种措施,让表呈现出这样的样子:

用语言表达,就是让医院名变成列名,下面是对应的人物的姓名。
我个人是有两种方式,
第一,先选出studentName和companyName两个列,然后列跟行倒置,最后新建视图保存结果。但是很遗憾,我最后百度了好多种方式,还是没搞定。最后尝试第二种方式。
第二,先建立一个表,列名为上面的各个公司的名字,然后查询对应的医院对应的学生名字,再将查询结果插入新建立的表中。为了方便你们理解我的话,我把代码写上;
insert into enterList(广州医院) select studentName from resultList where companyName = '广州医院';
insert into enterList(中山医院) select studentName from resultList where companyName = '中山医院';
insert into enterList(大岭山医院) select studentName from resultList where companyName = '大岭山医院';
insert into enterList(海南人民医院) select studentName from resultList where companyName = '海南人民医院';

执行,却得到非预期的如下的结果:

因此,想问问大家,这是为什么,我尝试把分号去掉,也不行。如果把其他列的值往上移,就是预期的结果了。
然后如果这两种方法都不行,有没有更好的建议呢?
谢谢你们
...全文
1187 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mumustudy 2018-12-10
  • 打赏
  • 举报
回复
dalao,请问这是c#么?
Dear SQL(燊) 2018-12-10
  • 打赏
  • 举报
回复
如要转的列数不确定,可以用用动态sql
Dear SQL(燊) 2018-12-10
  • 打赏
  • 举报
回复
if OBJECT_ID(N'tempdb.dbo.#t') is not null
drop table #t
go
 
create table #t
(studentname nvarchar(20),
 studentnum nvarchar(20),
 studentcity nvarchar(20),
 studentgender nvarchar(5),
 companyname nvarchar(20),
 studentgrade nvarchar(10))
 
insert into #t
select '张三','15209001','广东广州','男','广州医院','2015' union all
select '李四','15209002','广东深圳','男','中山医院','2015' union all
select '小芳','15209003','广东惠州','女','中山医院','2015' union all
select '王麻子','15209004','广东湛江','男','大岭山医院','2015' union all
select '周婷婷','15209005','广东河源','女','海南人民医院','2015' 

select *
from (select studentname,companyname,rid=ROW_NUMBER()over(partition by companyname order by studentname)
      from #t
	  ) a pivot (max(studentname) for companyname in([广州医院],[中山医院],[大岭山医院],[海南人民医院]) )pt

----------------------------------------------------------------------------------------------------------------------------------
rid                  广州医院                 中山医院                 大岭山医院                海南人民医院
-------------------- -------------------- -------------------- -------------------- --------------------
1                    张三                   李四                   王麻子                  周婷婷
2                    NULL                 小芳                   NULL                 NULL
xiaodai511 2018-05-08
  • 打赏
  • 举报
回复
select MAX(case when companyname='广州医院' then studentname else '' end) as 广州医院 ,MAX(case when companyname='中山医院' then studentname else '' end) as 中山医院 ,MAX(case when companyname='大岭山医院' then studentname else '' end) as 大岭山医院 ,MAX(case when companyname='海南人民医院' then studentname else '' end) as 海南人民医院 FROM (select *,ROW_NUMBER() over (partition by companyname order by (select 1)) as rn FROM #t) AS A GROUP by rn
RINK_1 2018-04-26
  • 打赏
  • 举报
回复

if OBJECT_ID(N'tempdb.dbo.#t') is not null
drop table #t
go

create table #t
(studentname nvarchar(20),
 studentnum nvarchar(20),
 studentcity nvarchar(20),
 studentgender nvarchar(5),
 companyname nvarchar(20),
 studentgrade nvarchar(10))

insert into #t
select '张三','15209001','广东广州','男','广州医院','2015' union all
select '李四','15209002','广东深圳','男','中山医院','2015' union all
select '小芳','15209003','广东惠州','女','中山医院','2015' union all
select '王麻子','15209004','广东湛江','男','大岭山医院','2015' union all
select '周婷婷','15209005','广东河源','女','海南人民医院','2015' 

declare @sql nvarchar(max)

with cte
as
(select *,ROW_NUMBER() over (partition by companyname order by (select 1)) as rn
from #t)

select 
@sql=ISNULL(@sql+',','')+'max(case when companyname='''+companyname+''' then studentname else '''' end) as '+companyname 
from (select companyname from #t group by companyname) as A

set @sql='with cte
as
(select *,ROW_NUMBER() over (partition by companyname order by (select 1)) as rn from #t)

select rn,'+@sql+' from cte group by rn'
exec(@sql)

gzhosp_redAnt 2018-04-26
  • 打赏
  • 举报
回复
引用 2 楼 leo_lesley 的回复:
--列数固定的用静态的行列转换

select 广州医院,中山医院,大岭山医院,海南人民医院
from resultList  pivot( max(studentname) for companyname in (广州医院,中山医院,大岭山医院,海南人民医院) ) a



--列数不固定的用动态的行列转换
declare @s varchar(1000)

select @s = isnull(@s,'') + ',' +companyname from resultList group by companyname
select @s =  'select ' + stuff(@s,1,1,'') + ' from resultList  pivot( max(studentname) for companyname in (' +stuff(@s,1,1,'')+ ') ) a'
exec (@s)
	
对的,其实你的第一种做法跟我的第二种做法,原理上是一样的,但是执行后输出的结果是跟我的非预期的结果一样,刚刚试了一下的....
leo_lesley 2018-04-26
  • 打赏
  • 举报
回复
--列数固定的用静态的行列转换

select 广州医院,中山医院,大岭山医院,海南人民医院
from resultList  pivot( max(studentname) for companyname in (广州医院,中山医院,大岭山医院,海南人民医院) ) a


--列数不固定的用动态的行列转换
declare @s varchar(1000)

select @s = isnull(@s,'') + ',' +companyname from resultList group by companyname
select @s =  'select ' + stuff(@s,1,1,'') + ' from resultList  pivot( max(studentname) for companyname in (' +stuff(@s,1,1,'')+ ') ) a'
exec (@s)
	

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧