sql server 实现 列记录转变成行记录

直接进入正题

因为我们数据中存储数据的方式,用行记录来存储,

但是有时候我们会碰到这样的客户,要求把行记录改成列记录,

这样他们看报表的时候看的会比较直观,

这时候就要用到列转换成行了。

1 create table #temp_volume -- 销量表
2  (
3 months char(7), --月份
4   category nvarchar(200),--类型
5   volume nvarchar(50), --销量
6  )
7 insert into #temp_volume values('2010/11','海飞丝','2800.24')
8 insert into #temp_volume values('2010/12','海飞丝','2475.85')
9 insert into #temp_volume values('2011/01','海飞丝','2485.25')
10 insert into #temp_volume values('2011/02','海飞丝','2478.69')
11
12
13 insert into #temp_volume values('2010/11','沙宣','3800.24')
14 insert into #temp_volume values('2010/12','沙宣','5258.85')
15 insert into #temp_volume values('2011/01','沙宣','4500.25')
16 insert into #temp_volume values('2011/02','沙宣','6520.69')
17
18 --再建一个表,用来存储转换好的数据
19 create table #temp
20 (
21 category nvarchar(200)
22 )
23 --为什么,只有一个字段呢,
24 --因为只有这个字段是固定的,因为我们是算某个类别的销量嘛
25
26 --就开始实现了
27 --首先把 固定的数据插进去,,
28
29 insert into #temp (category) select distinct category from #temp_volume
30 --然后算出要转换成多少列
31 --我们再增加一个临时表
32 select distinct months into #temp_Months from #temp_volume
33 --#temp_Months 这个里面就是我们要转换的列数了、
34 /*
35 开始循环生成列
36 我们讲下思路,因为我们要行转换成列,所以得先生成列,
37 然后再去更新,我的思路就是先取最小的月份,放到临时表中,
38 然后把临时表中的数据更新掉,然后把再把#temp_volume 里面的最小的月份的数据删掉,
39 这样的话,就不会出现重复的数据,循环完之后,#temp_volume这个里面的数据都没了。
40 */
41 --定义一个变量,存储最小月份
42 declare @minMonths char(7)
43 --定义一个字符串,
44 declare @sql varchar(8000) --定义到最大,以防出错
45 while exists(select *from #temp_Months)
46 begin
47 --取到最小月份
48 select @minMonths=min(months) from #temp_volume
49 --再把最小月份数据取出来
50 select * into #temp_MinMonthsVolume from #temp_volume where months=@minMonths
51 --生成动态的列
52 set @sql='alter table #temp add ['+@minMonths+'] nvarchar(50) '
53 print @sql
54 exec(@sql)
55 --更新最小月份的数据
56 set @sql='update #temp set ['+@minMonths+']=a.volume from #temp_volume a,#temp b where a.category=b.category and months='''+@minMonths+''''
57 exec(@sql)
58 print @sql
59 --删掉#temp_Months 里面 的最小月份
60 delete from #temp_Months where months=@minMonths
61 --删掉#temp_volume 里面的值
62 delete from #temp_volume where months=@minMonths
63 --删掉#temp_MinMonthsVolume 表
64 drop table #temp_MinMonthsVolume
65 end
66
67 select * from #temp
68
69 --
70 /*
71 drop table #temp_MinMonthsVolume
72 drop table #temp_Months
73 drop table #temp_volume
74 drop table #temp_category
75 drop table #temp
76 */

小弟初来咋到..第一次在 博客园发贴....

技术不好,还请高手见谅..

技术不好,请高手指点....

作者: UUhang
出处:http://www.cnblogs.com/yuanhang
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

原文地址:https://www.cnblogs.com/yuanhang/p/1994393.html