经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
mssql sqlserver 不固定行转列数据(动态列)
来源:cnblogs  作者:Adeal2008  时间:2019/2/26 9:32:23  对本文有异议

转自:http://www.maomao365.com/?p=5471
摘要:
下文主要讲述动态行列转换语句,列名会根据行数据的不同,
动态的发生变化
----------------------------------------------------
实现思路:
主要将待生成的动态列名,采用脚本拼接起来,然后采用pivot函数
运行,得到相应的结果
本脚本运行环境:
sql server 2008 

  1. /*生成源数据表*/
  2. create table #t
  3. (compname varchar(20),
  4. cheXi varchar(30),
  5. dayInfo int,
  6. daySaleValue int)
  7. /*生成源数据*/
  8. insert into #t(compname,cheXi,dayInfo,daySaleValue) values('一汽丰田','锐志','1',20)
  9. insert into #t(compname,cheXi,dayInfo,daySaleValue) values('一汽丰田','皇冠','1',10)
  10. insert into #t(compname,cheXi,dayInfo,daySaleValue) values('一汽丰田','霸道','2',30)
  11. insert into #t(compname,cheXi,dayInfo,daySaleValue) values('一汽丰田','锐志','3',40)
  12. insert into #t(compname,cheXi,dayInfo,daySaleValue) values('一汽丰田','RAV4','4',60)
  13. insert into #t(compname,cheXi,dayInfo,daySaleValue) values('一汽丰田','锐志','5',8)
  14. insert into #t(compname,cheXi,dayInfo,daySaleValue) values('一汽丰田','霸道','6',6)
  15. insert into #t(compname,cheXi,dayInfo,daySaleValue) values('一汽丰田','RAV4','5',9)
  16. insert into #t(compname,cheXi,dayInfo,daySaleValue) values('一汽丰田','RAV4','10',10)
  17. /*
  18. select * from
  19. (select compname,daySaleValue,dayInfo,chexi from #t) as d
  20. /*注意事项: pivot所涉及的聚合列 value_column 和 pivot_column
  21. 都必须存在 上面的查询表中
  22. */
  23. pivot(sum(daySaleValue) for dayInfo
  24. in([1],[2],[3],[4],[5],[6],[7],[8],[9],[10]))
  25. t ;
  26. */
  27. /*拼接字符串*/
  28. declare @sql varchar(max)
  29. set @sql =' select * from
  30. (select compname,daySaleValue,dayInfo,chexi from #t) as d
  31. pivot(sum(daySaleValue) for dayInfo
  32. in(
  33. ';
  34. /*动态组合列名*/
  35. declare @lieMing varchar(7000) ---定义动态生成列名存放变量
  36. declare @i int ,@imax int,@field varchar(60) ---定义临时循环变量
  37. declare @fieldList table(keyId int identity,field varchar(60)) ---定义临时表,存放待生成动态列名的数据
  38. insert into @fieldList(field) select distinct dayInfo from #t ---生成列名数据
  39. -------------循环表生成列名start--------------
  40. set @lieMing =''
  41. set @i=1
  42. select @imax =max(keyId) from @fieldList t
  43. while @i <@imax
  44. begin
  45. select @field =field from @fieldList t where t.keyId=@i
  46. if isnull(@field,'') !=''
  47. begin
  48. if @lieMing !='' begin set @lieMing =@lieMing +',' end
  49. set @lieMing = @lieMing+'['+@field+']';
  50. end
  51. set @i=@i+1
  52. end
  53. -------------循环表生成列名end--------------
  54. /*动态组合列*/
  55.  
  56. set @sql =@sql +@lieMing +' )) t ;'; ---拼接sql语句
  57. exec (@sql) ---执行sql脚本,生成相关数据
  58. truncate table #t
  59. drop table #t

 

 

原文链接:http://www.cnblogs.com/lairui1232000/p/10430189.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号