您的位置:首页 > 数据库

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

2007-07-13 16:57 393 查看
交叉报表/行列转换在实际的开发工作中,是经常要运用的一个技术点,在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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: