sql 行列转化/交叉报表的实现

交叉报表/行列转换在实际的开发工作中,是经常要运用的一个技术点,在CSDN的SQL SERVER社区提问也特别多,在此总结一下该技术实现的
基本思路如下:
一般的需求都是这样的,把表中具有相同属性的记录的相关列放在同一行上,其实需求里面就暗藏着我们解决问题的思路。具体的实现步骤
如下:
1.首先根据分类列进行分组。
2.把分组后的想放在同一行的列的值做为列名。
思路很简单,可能在实际的运用中,处理起来还是有些难度。
一般来说分组后记录数量是不确定的,那么要静态的SQL就比较应付记录数不确定的情况
所以一般都采用动态SQL,才能真正的满足显示业务的需求。
在组建动态SQL的时候,一般分为两步:
1.构建列转换成行的部分:根据分组后要转换列的具体每一个值来组建新行。
2.构建分组部分。
例如
地区    报价       日期
-------------------------
上海     25       2007-6-12
河北     10       2007-6-12
北京     12       2007-6-12
上海     99       2007-6-13
河北     6        2007-6-13
实现如下:
create table ttt(area varchar(200) null,price numeric(20,6) null,dt datetime null)
insert  into ttt(area,price, dt) select '上海',   25,'2007-6-12' union all select
'河北',   10,      '2007-6-12' union all select
'北京',   12,      '2007-6-12' union all select
'上海',   99,      '2007-6-13' union all select
'河北',   60,  '2007-6-13'

declare @sql varchar(8000)

select @sql=isnull(@sql,'')+' sum(case when area='''+area+'''then price  else 0 end )'+area+',' from  (select distinct area from ttt) as a
select @sql='select substring(convert(varchar(20),dt,120),6,6),'+substring(@sql,1,len(@sql)-1)+' from ttt group by dt '
print @sql
exec(@sql) 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值