sql server动态行专列pivot的in子查询

对于数据库行专列的方法 可以用 pivot 

pivot的三个参数  当作转变后值得列  for  要转成列得列名  in  转变后的列名字

动态数据的话没有办法确定几行 几列 名字也是根据动态内容变得 所以需要先用一个子查询查到转变后得列名字

也就是没转之前 所有行中 要转变列得列内容   例如: 要转成列得name  你得先知道原来name都有哪些  有名字1名字2

然后转后得列名 就是 名字1名字2  如果更多 3 4 5 那就需要5列了

所以这个 privot(max(value) for  name  in (列名集合也就是子查询原来行数name列下的数据))

但是in 后面没办法用子查询不识别 所以用存储过程 用变量去走这个子查询 

利用for xml path  stuff 结合变成 名字1,名字2 然后变量放入in中就完事了

sql server动态行专列pivot的in子查询_第1张图片

一个存储过程的列子:参考下定义变量 怎么用
CREATE PROCEDURE [dbo].[searchreport]  

    @CollectFormId nvarchar(100),
    @ElderId nvarchar(100)
AS
BEGIN
    
declare @name varchar(100);
declare @sql nvarchar(4000);
select @name= STUFF((select ','+'"'+rt.CollectFormItemId+'"' from health.Report r left join health.ReportItem rt on  r.Id=rt.ReportId where r.ElderId=''+@ElderId+'' and rt.CollectFormId=''+@CollectFormId+'' for xml path('')),1,1,'')

set @sql='select * from (select r.CollectionTime,rt.CollectFormItemId 从表表单id,rt.[Value] 值 from health.Report r left join health.ReportItem rt on  r.Id=rt.ReportId where r.ElderId='''+@ElderId+''' and r.CollectFormId='''+@CollectFormId+''') a
pivot
(
max(值)
for 从表表单id
in('+@name+')
) as b'
exec(@sql)
END
GO

你可能感兴趣的:(Sql)