经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
UNPIVOT逆透视以及动态逆透视存储过程
来源:cnblogs  作者:Insus.NET  时间:2019/5/21 9:22:22  对本文有异议

前几天一直练习PIVOT透视,还实现了动态透视的存过程《动态透视表https://www.cnblogs.com/insus/p/10888277.html

今天练习MS SQL Server逆透视的功能。

首先准备一些可以逆透视的数据:

 

  1. IF OBJECT_ID('tempdb.dbo.#Part_summary') IS NOT NULL DROP TABLE #Part_summary
  2. CREATE TABLE #Part_summary (
  3. [Item] NVARCHAR(40),
  4. [B]DECIMAL(18,2),
  5. [Q]DECIMAL(18,2),
  6. [S]DECIMAL(18,2),
  7. [T]DECIMAL(18,2),
  8. [U]DECIMAL(18,2)
  9. )
  10. INSERT INTO #Part_summary ([Item],[B],[Q],[S],[T],[U])
  11. VALUES ('098-SSSS1-WS0098-5526',0,0,500.00,0,0),
  12. ('54F-ART43-6545NN-2514',0,0,934.39,0,0),
  13. ('872-RTDE3-Q459PW-2323',0,0,0,452.44,0),
  14. ('B78-F1H2Y-5456UD-2530',0,0,0,115.06,0),
  15. ('I32-GG443-QT0098-0001',0,0,423.65,0,0),
  16. ('I38-AA321-WS0098-0506',470.87,0,0,0,0),
  17. ('K38-12321-5456UD-3493',200.28,0,0,0,0),
  18. ('PO0-7G7G7-JJY098-0077',0,871.33,0,0,0),
  19. ('RVC-43ASE-H43QWW-9753',0,0,0,0,555.19),
  20. ('X3C-SDEWE-3ER808-8764',0,607.88,0,0,0)
  21. SELECT [Item],[B],[Q],[S],[T],[U] FROM #Part_summary
Source Code

 

下面是Insus.NET实现UNPIVOT的代码:

 

  1. SELECT [Item]
  2. ,[Category]
  3. ,[Qty]
  4. FROM #Part_summary
  5. UNPIVOT (
  6. [Qty] FOR [Category]
  7. IN ([B],[Q],[S],[T],[U])
  8. ) AS [UNPIVOT TABLE]
  9. WHERE [Qty] > 0
Source Code

 

以上是以手动实现逆透视。如果想实现动态逆透视。可以参考下面的存储过程:

 

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5.  
  6. -- =============================================
  7. -- Author: Insus.NET
  8. -- Create date: 2019-05-20
  9. -- Update date: 2019-05-20
  10. -- Description: 动态逆透视
  11. CREATE PROCEDURE [dbo].[usp_Dynamic_UnPivot]
  12. (
  13. @table_name SYSNAME, --透视的表名
  14. @common_column SYSNAME, --常规共用列名
  15. @unpivot_column SYSNAME, --逆透视列名
  16. @sum_column SYSNAME, --计和的列名
  17. @Comma_Delimited_Column_Names NVARCHAR(MAX)
  18. )
  19. AS
  20. BEGIN
  21. DECLARE @sql AS NVARCHAR(MAX) = N'
  22. SELECT '+ @common_column +'
  23. ,'+ @unpivot_column +'
  24. ,[Qty]
  25. FROM '+ @table_name +'
  26. UNPIVOT (
  27. '+ @sum_column +' FOR '+ @unpivot_column +'
  28. IN ('+ @Comma_Delimited_Column_Names +')
  29. ) AS [UNPIVOT TABLE]
  30. WHERE '+ @sum_column +' > 0'
  31.  
  32. EXECUTE sp_executeSql @sql
  33.  
  34. END
  35. GO
Source Code

 

怎样使用这个存储过程呢,参考下面参数传入方法:

 

重复一下,存储过程的参数说明如下:

  1. @table_name SYSNAME, --透视的表名
  2. @common_column SYSNAME, --常规共用列名
  3. @unpivot_column SYSNAME, --逆透视列名
  4. @sum_column SYSNAME, --计和的列名
  5. @Comma_Delimited_Column_Names NVARCHAR(MAX)

 

原文链接:http://www.cnblogs.com/insus/p/10894454.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号