学习使用PIVOT

假设有这样的一个需求:

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

现在要求根据员工的姓名进行查询,查询出某些员工各个年份的薪金总数,出来的结果要求
 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;

结果如:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值