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

写一个符合自己要求使用透视存储过程。在开发时,直接使用即可。

 

  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-19
  9. -- Update date: 2019-05-19
  10. -- Description: 动态透视
  11. CREATE PROCEDURE [dbo].[usp_Dynamic_Pivot]
  12. (
  13. @table_name SYSNAME, --透视的表名
  14. @common_column SYSNAME, --常规共用列名
  15. @which_row_to_column SYSNAME, --哪一行需要透视为列的列名
  16. @sum_column SYSNAME --计和的列名
  17. )
  18. AS
  19. BEGIN
  20. DECLARE @Comma_Delimited_Column_Names NVARCHAR(MAX)
  21. DECLARE @query NVARCHAR(MAX) = N'SET @Comma_Delimited_Column_Names = STUFF((SELECT DISTINCT '','' + QUOTENAME('+ @which_row_to_column +')
  22. FROM '+ @table_name +'
  23. FOR XML PATH(''''), TYPE
  24. ).value(''.'', ''NVARCHAR(MAX)'')
  25. ,1,1,'''')'
  26.  
  27. EXECUTE sp_executeSql @query, N'@Comma_Delimited_Column_Names AS NVARCHAR(MAX) OUTPUT',@Comma_Delimited_Column_Names OUTPUT
  28. DECLARE @sql AS NVARCHAR(MAX) = N'
  29. SELECT '+ @common_column +',
  30. ' + @Comma_Delimited_Column_Names + '
  31. FROM
  32. (
  33. SELECT '+ @common_column +','+ @which_row_to_column +','+ @sum_column +' FROM '+ @table_name +'
  34. ) AS [Source]
  35. PIVOT
  36. (
  37. SUM('+ @sum_column +')
  38. FOR '+ @which_row_to_column +' IN (' + @Comma_Delimited_Column_Names + ')
  39. ) AS [PIVOT TABLE] '
  40.  
  41. EXECUTE sp_executeSql @sql
  42.  
  43. END
  44. GO
Source Code

 

存储过程有几个参数:

  1. @table_name SYSNAME, --透视的表名
  2. @common_column SYSNAME, --常规共用列名
  3. @which_row_to_column SYSNAME, --哪一行需要透视为列的列名
  4. @sum_column SYSNAME --计和的列名

 

举例说明,先准备一些数据:

 

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

 

现在,我们执行上面的存储过程,仔细看所传入的参数:

 

另一个例子:

 

再翻开以前一个例子,《T-SQL PIVOT 行列转换https://www.cnblogs.com/insus/archive/2011/03/05/1971446.html 

改为使用上面的存储过程来实现:

 

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