Advertisement
Guest User

Untitled

a guest
Feb 25th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.10 KB | None | 0 0
  1. EmpID Job EffDate Dept
  2. 001 QB 01-01-2001 OFF
  3. 001 LB 01-01-2010 DEF
  4. 001 K 01-01-2005 SPEC
  5. 002 HC 01-01-2007 STAFF
  6. 003 P 01-01-2001 SPEC
  7. 003 CB 01-01-2002 DEF
  8.  
  9. EmpID Job1 EffDate1 Dept1 Job2 EffDate2 Dept2 Job3 EffDate3 Dept3
  10. 001 QB 01-01-2001 OFF K 01-01-2005 SPEC LB 01-01-2010 DEF
  11. 002 HC 01-01-2007 STAFF
  12. 003 P 01-01-2001 SPEC CB 01-01-2002 DEF
  13.  
  14. SELECT
  15. EmpNo
  16. , Job
  17. , EffDate
  18. , Dept
  19. , ROW_NUMBER() OVER (PARTITION BY EmpNo ORDER BY EffDate) AS RowNum
  20. INTO #temp1
  21. FROM JobHist
  22. ORDER BY EffDate DESC
  23.  
  24. SELECT
  25. JobHist.EmpNo
  26. , JobHist.Job AS Job1
  27. , JobHist.EjhJobDesc AS JobDesc1
  28. , JobHist.EffDate AS EffDate1
  29. , JobHist.Dept AS Dept1
  30. , temp2.Job AS Job2
  31. , temp2.EffDate AS EffDate2
  32. , temp2.Dept AS Dept2
  33. FROM #temp1 AS JobHist LEFT JOIN #temp1 AS temp2 ON JobHist.EmpNo = temp2.EmpNo AND temp2.RowNum = 2
  34. WHERE JobHist.RowNum = 1
  35.  
  36. DECLARE @Flag INT
  37. DECLARE @FlagPlus INT
  38. SET @Flag = 1
  39. SET @FlagPlus = (@Flag + 1)
  40. WHILE(@Flag < 20)
  41. BEGIN
  42. SELECT
  43. temp@Flag.EmpNo
  44. , temp@Flag.Job AS Job@Flag
  45. , temp@Flag.EjhJobDesc AS JobDesc@Flag
  46. , temp@Flag.EffDate AS EffDate@Flag
  47. , temp@Flag.Dept AS Dept@Flag
  48. FROM #temp1 AS temp@Flag
  49. LEFT JOIN #temp@Flag AS temp@FlagPlus
  50. ON temp@Flag.EmpNo = temp@FlagPlus.EmpNo AND temp@FlagPlus.RowNum = @FlagPlus
  51. WHERE JobHist.RowNum = 1
  52. SET @Flag = (@Flag + 1)
  53. SET @FlagPlus = (@FlagPlus + 1)
  54. END
  55.  
  56. select *
  57. from
  58. (
  59. select empid, col + cast(rn as varchar(10)) colname, value
  60. from
  61. (
  62. select Top 20 empid,
  63. job,
  64. convert(varchar(10), effdate, 101) effdate,
  65. dept,
  66. row_number() over(partition by empid order by effdate) rn
  67. from yourtable
  68. order by empid
  69. ) x
  70. unpivot
  71. (
  72. value
  73. for col in (Job, Effdate, Dept)
  74. ) u
  75. ) x1
  76. pivot
  77. (
  78. min(value)
  79. for colname in([Job1], [EffDate1], [Dept1],
  80. [Job2], [EffDate2], [Dept2],
  81. [Job3], [EffDate3], [Dept3])
  82. )p
  83.  
  84. DECLARE @colsUnpivot AS NVARCHAR(MAX),
  85. @query AS NVARCHAR(MAX),
  86. @colsPivot as NVARCHAR(MAX),
  87. @colsPivotName as NVARCHAR(MAX)
  88.  
  89. select @colsUnpivot = stuff((select ','+ quotename(C.name)
  90. from sys.columns as C
  91. where C.object_id = object_id('yourtable') and
  92. C.name not in ('empid')
  93. for xml path('')), 1, 1, '')
  94.  
  95. select @colsPivot
  96. = STUFF((SELECT ','
  97. + quotename(c.name + cast(t.rn as varchar(10)))
  98. from
  99. (
  100. select row_number() over(partition by empid order by effdate) rn
  101. from yourtable
  102. ) t
  103. cross apply sys.columns as C
  104. where C.object_id = object_id('yourtable') and
  105. C.name not in ('empid')
  106. group by c.name, t.rn
  107. order by t.rn, c.name desc
  108. FOR XML PATH(''), TYPE
  109. ).value('.', 'NVARCHAR(MAX)')
  110. ,1,1,'')
  111.  
  112. set @query
  113. = 'select *
  114. from
  115. (
  116. select empid, col + cast(rn as varchar(10)) colname, value
  117. from
  118. (
  119. select Top 20 empid,
  120. job,
  121. convert(varchar(10), effdate, 101) effdate,
  122. dept,
  123. row_number() over(partition by empid order by effdate) rn
  124. from yourtable
  125. order by empid
  126. ) x
  127. unpivot
  128. (
  129. value
  130. for col in ('+ @colsunpivot +')
  131. ) u
  132. ) x1
  133. pivot
  134. (
  135. min(value)
  136. for colname in ('+ @colspivot +')
  137. ) p'
  138.  
  139. exec(@query)
  140.  
  141. SELECT
  142. e.EmpNo,
  143. (SELECT
  144. h.Job,
  145. h.EffDate,
  146. h.Dept
  147. FROM JobHist h
  148. WHERE e.EmpNo = h.EmpNo
  149. ORDER BY EffDate DESC
  150. FOR XML PATH('job'), ROOT('jobs'), TYPE
  151. ) Jobs
  152. FROM (SELECT DISTINCT EmpNo FROM JobHist) e
  153.  
  154. SELECT
  155. EmpNo
  156. , Job
  157. , EffDate
  158. , Dept
  159. , ROW_NUMBER() OVER (PARTITION BY EmpNo ORDER BY EffDate) AS RowNum
  160. INTO #temp1
  161. FROM JobHist
  162. ORDER BY EffDate DESC
  163.  
  164.  
  165. DECLARE @MAXCol INT = (SELECT MAX(RowNum)FROM #temp1)
  166. ,@index INT =1
  167. ,@ColNames varchar(4000)=''
  168. ,@SQL VARCHAR(MAX)=''
  169. WHILE (@index<=@MAXCol)
  170. BEGIN
  171. SET @ColNames =@ColNames +'MAX(CASE WHEN RowNum = '+LTRIM(STR(@index))+' THEN Job END) as Job'+LTRIM(STR(@index))+','
  172. +'MAX(CASE WHEN RowNum = '+LTRIM(STR(@index))+' THEN EffDate END) as EffDate'+LTRIM(STR(@index))+','
  173. +'MAX(CASE WHEN RowNum = '+LTRIM(STR(@index))+' THEN Dept END) as Dept'+LTRIM(STR(@index))+','
  174. SET @Index=@Index +1
  175. END
  176. SET @ColNames = LEFT(@ColNames,LEN(@ColNames)-1) -- Remove Last Comma
  177.  
  178. SET @SQL = 'SELECT EmpNo ,'+@ColNames+' FROM #temp1 GROUP BY EmpNo'
  179.  
  180. EXECUTE (@SQL)
  181.  
  182. DECLARE @sql NVARCHAR(MAX) = N'SELECT EmpID';
  183.  
  184. SELECT TOP (20) @sql += N',
  185. Job' + rn + ' = MAX(CASE WHEN rn = ' + rn + ' THEN Job END),
  186. EffDate' + rn + ' = MAX(CASE WHEN rn = ' + rn + ' THEN EffDate END),
  187. Dept' + rn + ' = MAX(CASE WHEN rn = ' + rn + ' THEN Dept END)'
  188. FROM
  189. (
  190. SELECT rn = RTRIM(ROW_NUMBER() OVER (ORDER BY name))
  191. FROM sys.all_objects
  192. ) AS x;
  193.  
  194. SET @sql += ' FROM (SELECT *, rn = ROW_NUMBER() OVER
  195. (PARTITION BY EmpID ORDER BY EffDate) FROM dbo.your_table) AS y
  196. GROUP BY EmpID;';
  197.  
  198. EXEC sp_executesql @sql;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement