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=''+@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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值