• 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
    版权:本文版权归作者和博客园共有
    转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
    要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

  • 相关阅读:
    bzoj 3035 二分答案+二分图最大匹配
    bzoj 1058 bst
    bzoj 1093 缩点+DP
    bzoj 1452 二维树状数组
    bzoj 1968 数学
    bzoj 1034 贪心
    牛客小白月赛12 I (tarjan求割边)
    Loj 103、10043 (KMP统计子串个数)
    poj 2356 (抽屉原理)
    hdu 1907 (尼姆博弈)
  • 原文地址:https://www.cnblogs.com/yuanhang/p/1994393.html
Copyright © 2020-2023  润新知