sqlserver pivot 动态行转列且一行转多列的解决方案

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010892506/article/details/89458862

今天有个同学要做行转列的问题,把实现过程记录一下
首先把同学要实现的原表晒出来,大家看下

在这里插入图片描述这是同学要实现的效果,主要是一行转多行的效果,且转换前不知道有多少唯一行值该转为列在这里插入图片描述
下面直接贴代码,仅供大家参考,如果有疑问请联系我qq,2625526306,有偿代写sql,原创,转载需备注,谢谢

  1. 知识点,pivot的用法,语法如下
  2. SELECT ,
    [first pivoted column] AS ,
    [second pivoted column] AS ,

    [last pivoted column] AS
    FROM
    (<查询表或者子查询作为数据源>)
    AS 表别名
    PIVOT
    (
    <聚合函数>(<被聚合的列>)
    FOR
    [<待转换的列名称,此列的多个唯一值将被转换为列标题>]
    IN ( [first pivoted column], [second pivoted column],
    … [last pivoted column])
    ) AS <旋转表的别名>
    <可选的排序子句 order by >;
    可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。 PIVOT 轮换表值表达式,具体方法是将表达式某一列中的唯一值转换为输出中的多个列,并在必要时对最终输出中所需的其余任何列值运行聚合。 与 PIVOT 执行的操作相反,UNPIVOT 将表值表达式的列轮换为列值。
if object_id('tempdb..#test')  is not null
drop table #test
create table #test
( 事项名称 varchar(200),
  年月 varchar(7),
  受理数量 int ,
  办结数量 int
)

insert into #test 
select '注销','2019-01',77,77
union all 
select '注销','2019-02',66,77
union all 
select '延续','2019-03',16,16
union all 
select '注销','2019-04',16,16
union all 
select '延续','2019-04',120,115
 --select *from  #test
  declare  @event varchar(3000)='',@sql varchar(3000)='',@queryexp varchar(3000)=''
   if object_id('tempdb..#hbTab') is not null
     drop table #hbtab
  select   事项名称,(年月+'_受理') as [year],受理数量,年月 into #hbtab  from #test
   --列转行
  insert into #hbtab
  select  事项名称,(年月+'_办结') as [year],办结数量,年月 from #test
  --获取行的属性
  --select *from #hbtab
  select @event=@event+',['+[year]+']'  from (select distinct [year] from #hbtab) a order by [year]
  select @queryexp=@queryexp+',max(['+[year]+']) as '+'['+[year]+']'  from (select distinct [year] from #hbtab) a order by [year]
select  @queryexp=right(@queryexp,len(@queryexp)-1)
select  @event=right(@event,len(@event)-1)

--select *from #hbtab order by year
set @sql='select 事项名称,'+@queryexp+' from( select 事项名称,'+@event +'from #hbtab a  
pivot (max(受理数量) for year in('+@event+') 
) as pv ) b group by 事项名称'
print @sql
 exec(@sql)



展开阅读全文

没有更多推荐了,返回首页