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中就完事了
一个存储过程的列子:参考下定义变量 怎么用
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=''[email protected]+'' and rt.CollectFormId=''[email protected]+'' 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='''[email protected]+''' and r.CollectFormId='''[email protected]+''') a
pivot
(
max(值)
for 从表表单id
in('[email protected]+')
) as b'
exec(@sql)
END
GO