sql-server – 目标的SQL动态数据透视

前端之家收集整理的这篇文章主要介绍了sql-server – 目标的SQL动态数据透视前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Convert Rows to columns using ‘Pivot’ in SQL Server7个
假设我有一个包含以下行和列的表
  1. EmpCode Empname Goals
  2. ------- ---- ------
  3. 101 kiran readsql
  4. 101 kiran coding
  5. 101 kiran readcss
  6. 102 rohit coding
  7. 102 rohit readjava
  8. 103 pradi do nothing

我想以下面的格式显示上表:

  1. EmpCode Empname Goal1 Goal2 Goal3
  2. ------- ---- ------ ------ ------
  3. 101 kiran readsql coding readcss
  4. 101 rohit coding readjava
  5. 103 pradi do nothing

实地目标是动态的,请帮助我.谢谢.

解决方法

  1. CREATE TABLE #tt(id INT IDENTITY(1,1) PRIMARY KEY,EmpCode INT,Empname VARCHAR(2566),Goals VARCHAR(256));
  2. INSERT INTO #tt(EmpCode,Empname,Goals)VALUES
  3. (101,'kiran','readsql'),(101,'coding'),'readcss'),(102,'rohit','readjava'),(103,'pradi','do nothing');
  4.  
  5. DECLARE @goal_cols NVARCHAR(MAX)=STUFF((
  6. SELECT DISTINCT N',Goal'+CAST(ROW_NUMBER()OVER(PARTITION BY empcode ORDER BY id) AS VARCHAR(3))
  7. FROM #tt
  8. FOR XML PATH('')
  9. ),1,''
  10. );
  11.  
  12. DECLARE @stmt NVARCHAR(MAX)=N'
  13. SELECT *
  14. FROM (
  15. SELECT
  16. EmpCode,Goals,goal_id=''Goal''+CAST(ROW_NUMBER()OVER(PARTITION BY empcode ORDER BY id) AS VARCHAR(3))
  17. FROM
  18. #tt
  19. ) AS s
  20. PIVOT(MAX(Goals) FOR goal_id IN ('+@goal_cols+')) AS p
  21. ORDER BY EmpCode;';
  22.  
  23. EXECUTE sp_executesql @stmt;
  24.  
  25. DROP TABLE #tt;

结果:

  1. +---------+---------+------------+----------+---------+
  2. | EmpCode | Empname | Goal1 | Goal2 | Goal3 |
  3. +---------+---------+------------+----------+---------+
  4. | 101 | kiran | readsql | coding | readcss |
  5. | 102 | rohit | coding | readjava | NULL |
  6. | 103 | pradi | do nothing | NULL | NULL |
  7. +---------+---------+------------+----------+---------+

猜你在找的MsSQL相关文章