mysql将行转列sql server_自己写的sqlserver和mysql的行转列通用存储过程

/*1 * Description:对数据表进行行列转换

2 * Author:llf

3 * 调用说明:exec SP_RowChangeCol '学生成绩表','姓名','课程','分数','desc',0,0,'where 年

级=''一年级'''

4 * 该存储过程调用的相关函数:dbo.Get_StrArrayLength(@groupCol,',');

dbo.dbo.Get_StrArrayStrOfIndex(@groupCol,',',1)*/alterprocSP_RowChangeCol@tableNamevarchar(100),--要转换的数据表名(学生成绩表)@groupColvarchar(100),--分组列(学生姓名)@changeColvarchar(100),--要转换的列(考试科目)@countColvarchar(100),--统计列(成绩)@orderbyvarchar(4),--转换列的排序规则(升序asc,降序desc)@isColSumint,--是否统计列(0否;1是)@isRowSumint,--是否统计行(0否;1总计行;2小计行)@strWherevarchar(8000)--查询条件('where 年级=''一年级''')asbegindeclare@sqlheadvarchar(8000),@sqlendvarchar(8000)

,@sql1varchar(8000),@sql2varchar(8000),@sql3varchar(8000),@sql4varchar(8000)

,@iint,@icvarchar(20),@sqlvarchar(8000)/*****创建临时表******************/createtable#Temp_Change

([id]intidentity(0,1),[gid]int,[info]varchar(1000)

)/*****生成数据处理临时表**********/set@sql='insert into #Temp_Change select gid=0

,info='',[''+cast('+@changeCol+'as varchar)+'']=sum(case'+@changeCol+'when''''''+cast('+@changeCol+'as varchar)+''''''then'+@countCol+'else 0 end)''from(select distinct'+@changeCol+'from'+@tableName+''+@strWhere+') a order by'+@changeCol+''+@orderby+''/*insert into #Temp_Change select gid=0

,info=',['+cast(日期 as varchar)+']=sum(case 日期 when '''+cast(日期 as varchar)

+''' then 销售额 else 0 end)'

from(select distinct 日期 from tb) a*/--print @sqlexec(@sql)

--select*from#Temp_Change/*****判断需要多少个变量来处理*************/select@i=max(len(info))from#Temp_Changeprint@iif(@i<>0)--判断数据表@tableName中是否有数据set@i=7600/@ielsereturn--分组临时表if(@i<>0)update#Temp_Changesetgid=id/@iselect@i=max(gid)from#Temp_Change/*****处理多个统计列的情况************/--获得字符数组的长度declare@ArrayLengthintset@ArrayLength=dbo.Get_StrArrayLength(@groupCol,',')declare@nextintset@next=1select@sqlhead='''select'while@next<=@ArrayLengthbeginIF(@next=@ArrayLength)--最后一个字段BEGINselect@sqlhead=@sqlhead+'case when grouping('+dbo.Get_StrArrayStrOfIndex

(@groupCol,',',@next)+')=1 then''''合计''''else convert(varchar(200),'+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@next)+',120) end as '+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@next)+''''END/*ELSE IF(@next=@ArrayLength)

BEGIN

select @sqlhead=@sqlhead+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@next)+''''

END*/ELSEBEGINselect@sqlhead=@sqlhead+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@next)+','ENDset@next=@next+1end/*****生成数据处理语句**************************/--处理条件字符串set@strWhere=replace(@strWhere,'''','''''');IF(@isColSum=0AND@isRowSum=0)--不统计BEGIN--select @sqlhead='''select '+@groupCol+'=cast('+@groupCol+' as varchar)'''select@sqlhead='''select'+@groupCol+'''',@sqlend='''from'+@tableName+''+@strWhere+'group by'+@groupCol+'''',@sql1='',@sql2='select',@sql3='',@sql4=''ENDIF(@isRowSum=0AND@isColSum=1)--要进行col统计BEGIN--select @sqlhead='''select '+@groupCol+'=cast('+@groupCol+' as varchar)'''select@sqlhead='''select'+@groupCol+'''',@sqlend=''',sum('+@countCol+') as''''合计''''from'+@tableName+''+@strWhere+'group by'+@groupCol+'''',@sql1='',@sql2='select',@sql3='',@sql4=''ENDIF(@isRowSum=1AND@isColSum=0)--要进行row总计BEGINIF(charIndex(',',@groupCol)=0)--只有一个分组列BEGIN/*select  case when grouping(a)=1 then '合计' else cast(a as varchar)

end a,b,c,sum(d),sum(e) from #t

group by a,b,c with rollup

having grouping(c)=0 or grouping(a)=1*/select@sqlhead='''select case when grouping('+@groupCol+')=1 then''''合

计''''else cast('+@groupCol+'as varchar) end as'+@groupCol+'''',@sqlend='''from'+@tableName+''+@strWhere+'group by'+@groupCol+'with rollup''',@sql1='',@sql2='select',@sql3='',@sql4=''ENDELSEBEGINSELECT@sqlend='''from'+@tableName+''+@strWhere+'group by'+@groupCol+'with rollup having grouping('+dbo.Get_StrArrayStrOfIndex

(@groupCol,',',@ArrayLength)+')=0

or grouping('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',1)+')=1''',@sql1='',@sql2='select',@sql3='',@sql4=''ENDENDIF(@isRowSum=2AND@isColSum=0)--要进行row小计BEGINIF(charIndex(',',@groupCol)=0)--只有一个分组列BEGIN/*select  case when grouping(a)=1 then '合计' else cast(a as varchar)

end a,b,c,sum(d),sum(e) from #t

group by a,b,c with rollup

having grouping(c)=0 or grouping(a)=1*/select@sqlhead='''select case when grouping('+@groupCol+')=1 then''''合

计''''else cast('+@groupCol+'as varchar) end as'+@groupCol+'''',@sqlend='''from'+@tableName+''+@strWhere+'group by'+@groupCol+'with rollup''',@sql1='',@sql2='select',@sql3='',@sql4=''ENDELSEBEGIN/*Groups=CASE

WHEN GROUPING(Color)=0 THEN Groups

WHEN GROUPING(Groups)=1 THEN '总计'

ELSE '' END,

Item=CASE

WHEN GROUPING(Color)=0 THEN Item

WHEN GROUPING(Groups)=0 AND GROUPING(Item)

=1  THEN '合计'

ELSE '' END,

Color=CASE

WHEN GROUPING(Color)=0 THEN Color

WHEN  GROUPING(Item)=0 AND GROUPING(Color)

=1 THEN '小计'

ELSE '' END,*/select@sqlhead='''select'--第一个字段set@sqlhead=@sqlhead+dbo.Get_StrArrayStrOfIndex(@groupCol,',',1)+'=case when grouping

('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+')=0 then'+dbo.Get_StrArrayStrOfIndex(@groupCol,',',1)+'when grouping('+dbo.Get_StrArrayStrOfIndex

(@groupCol,',',1)+')=1 then''''总计''''else''''''''end,'declare@colIndexintset@colIndex=2while@colIndex

('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+')=0 then'+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@colIndex)+'when grouping

('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@colIndex-1)+')=0 and grouping

('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@colIndex)+')=1 then''''合计''''else''''''''end,'set@colIndex=@colIndex+1end--最后一个字段set@sqlhead=@sqlhead+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+'=case when

grouping('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+')=0 then'+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+'when grouping

('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength-1)+')=0 and grouping

('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+')=1 then''''小计''''else''''''''end'''select@sqlend='''from'+@tableName+''+@strWhere+'group by'+@groupCol+'with rollup''',@sql1='',@sql2='select',@sql3='',@sql4=''ENDENDIF(@isRowSum=1AND@isColSum=1)--要进行行和列统计(行总计)BEGINIF(charIndex(',',@groupCol)=0)--只有一个分组列BEGIN--select @sqlhead='''select '+@groupCol+'=cast(isnull('+@groupCol+',''''total'''')asvarchar)'''select @sqlhead='''selectcasewhengrouping('+@groupCol+')=1then''''合

计''''elsecast('+@groupCol+'asvarchar)endas'+@groupCol+'''',@sqlend=''',sum('+@countCol+')as''''合计''''from'+@tableName+''+@strWhere+'groupby'+@groupCol+'withrollup''',@sql1='',@sql2='select',@sql3='',@sql4=''END

ELSE

BEGIN

SELECT @sqlend=''',sum('+@countCol+')as''''合计''''from'+@tableName+''+@strWhere+'groupby'+@groupCol+'withrolluphavinggrouping('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+')=0orgrouping('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',1)+')=1''',@sql1='',@sql2='select',@sql3='',@sql4=''END

END

IF( @isRowSum=2 AND @isColSum=1 ) --要进行行和列统计(行小计)

BEGIN

IF(charIndex(',',@groupCol)=0)

BEGIN

--select @sqlhead='''select'+@groupCol+'=cast(isnull('+@groupCol+',''''total'''')asvarchar)'''select @sqlhead='''selectcasewhengrouping('+@groupCol+')=1then''''合

计''''elsecast('+@groupCol+'asvarchar)endas'+@groupCol+'''',@sqlend=''',sum('+@countCol+')as''''合计''''from'+@tableName+''+@strWhere+'groupby'+@groupCol+'withrollup''',@sql1='',@sql2='select',@sql3='',@sql4=''END

ELSE

BEGIN

select @sqlhead='''select'--第一个字段

set

@sqlhead=@sqlhead+dbo.Get_StrArrayStrOfIndex(@groupCol,',',1)+'=casewhengrouping('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+')=0then'+dbo.Get_StrArrayStrOfIndex(@groupCol,',',1)+'whengrouping('+dbo.Get_StrArrayStrOfIndex

(@groupCol,',',1)+')=1then''''总计''''else''''''''end,'declare @colIndex1 int

set @colIndex1=2

while @colIndex1

begin

set

@sqlhead=@sqlhead+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@colIndex1)+'=casewhengrouping('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+')=0then'+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@colIndex1)+'whengrouping('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@colIndex1-1)+')=0andgrouping('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@colIndex1)+')=1then''''合计''''else''''''''end,'set @colIndex1=@colIndex1+1

end

--最后一个字段

set

@sqlhead=@sqlhead+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+'=casewhengrouping('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+')=0then'+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+'whengrouping('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength-1)+')=0andgrouping('+dbo.Get_StrArrayStrOfIndex(@groupCol,',',@ArrayLength)+')=1then''''小计''''else''''''''end'''SELECT @sqlend=''',sum('+@countCol+')as''''合计''''from'+@tableName+''+@strWhere+'groupby'+@groupCol+'withrollup''',@sql1='',@sql2='select',@sql3='',@sql4=''END

END

while @i>=0

begin

select @ic=cast(@i as varchar),@i=@i-1

,@sql1='@'+@ic+'varchar(8000),'+@sql1

,@sql2=@sql2+'@'+@ic+'='''',',@sql3='select@'+@ic+'=@'+@ic+'+infofrom#Temp_Changewheregid='+@ic

+char(13)+@sql3

,@sql4=@sql4+'+@'+@ic

end

select @sql1='declare'+left(@sql1,len(@sql1)-1)+char(13)

,@sql2=left(@sql2,len(@sql2)-1)+char(13)

,@sql3=left(@sql3,len(@sql3)-1)

,@sql4=substring(@sql4,2,len(@sql4))

/*****执行***********************/

print  @sql1+@sql2+@sql3+'exec('+@sqlhead+'+'+@sql4+'+'+@sqlend+')'exec( @sql1+@sql2+@sql3+'exec('+@sqlhead+'+'+@sql4+'+'+@sqlend+')')

/*****删除临时表**********************/

drop table #Temp_Change

end

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值