学习使用PIVOT

来源:互联网 发布:dede游戏网站源码 编辑:程序博客网 时间:2024/06/04 19:23

假设有这样的一个需求:

有一个表中存储了某个部门的各个员工的每一年的各类薪金,
记录存储格式如:
 员工姓名 薪金数目 薪金种类 年份

现在要求根据员工的姓名进行查询,查询出某些员工各个年份的薪金总数,出来的结果要求
 ColumnName:  年份 员工1姓名 员工2姓名 ...
 ColumnValue: 年份 薪金总数 薪金总数

这个时候使用PIVOT来进行将行转换了列,操作就变得很方便,而由于PIVOT是静态的列,所以要使其起到动态的效果,只有用SQL拼接的方法实现,如

  1. -- Test Data
  2. IF OBJECT_ID('TEMPDB..#T_Money') IS NOT NULL
  3. BEGIN
  4.     DROP TABLE #T_Money
  5.     PRINT 'Drop Complate.'
  6. END
  7. Create Table #T_Money
  8. (
  9.     [ID]            INT             NULL,
  10.     [Name]          NVARCHAR(256)   NULL,
  11.     [Money]         Money           NULL,
  12.     [Type]          NVARCHAR(128)   NULL,
  13.     [Year]          INT             NULL
  14. );
  15. INSERT INTO #T_Money VALUES(1,N'小斌',15000,N'月薪',2007);
  16. INSERT INTO #T_Money VALUES(2,N'小斌',5000,N'奖金',2007);
  17. INSERT INTO #T_Money VALUES(3,N'小斌',20000,N'月薪',2008);
  18. INSERT INTO #T_Money VALUES(4,N'小斌',10000,N'奖金',2008);
  19. INSERT INTO #T_Money VALUES(5,N'小珍',5000,N'月薪',2007);
  20. INSERT INTO #T_Money VALUES(6,N'小珍',5000,N'奖金',2007);
  21. INSERT INTO #T_Money VALUES(7,N'小珍',10000,N'月薪',2008);
  22. INSERT INTO #T_Money VALUES(8,N'小珍',5000,N'奖金',2008);
  23. -- Unite SQL
  24. DECLARE @Names AS NVARCHAR(2048);
  25. WITH T_NAMES AS
  26. (
  27.     SELECT DISTINCT
  28.         [Name]
  29.     FROM
  30.         #T_Money
  31. )
  32. SELECT
  33.     @Names = ISNULL(@Names + N',[''[' ) 
  34.                 + CAST(Name AS NVARCHAR(256))
  35.                 + ']'
  36. FROM
  37.     T_NAMES
  38. WHERE
  39.     Name LIKE N'%斌%';
  40. PRINT @Names;
  41. DECLARE @SQL NVARCHAR(MAX);
  42. SET @SQL = N'
  43.             SELECT 
  44.                 * 
  45.             FROM 
  46.             (
  47.                 SELECT 
  48.                     [Name]
  49.                     ,[Money]
  50.                     ,[Year]
  51.                 FROM
  52.                     #T_Money
  53.             ) AS Tmp_PIV
  54.             PIVOT
  55.             (
  56.                 SUM(Money)
  57.                 FOR [Name] IN (' + @Names + ')
  58.             ) AS Tmp_Money
  59.             Order By 
  60.                 Year';
  61. PRINT @SQL;
  62. EXEC sp_executesql @SQL;

结果如: