我在SQL Server(SSMS)中工作,有三个表,如此
表A
ProcessID Step Approver
17 10 Kim
18 20 Joe
19 10 Beth
20 20 Josh
表B
ProcessID DeptCode
17 515
18 515
19 190
20 190
表C
ProcessID AlternateApprover
17 Sarah
18 David
19 Don
20 Don
并希望我的结果格式为:
DeptCode FirstApprover FirstAlternate SecondApprover SecondAlternate
515 Kim Sarah Joe David
190 Beth Don Josh Don
我已经成功完成了批准者的调整,但我不确定如何加入替代品(表C)。
我知道这种规范化有点奇怪 - 它不是我的数据库而且我无法控制表结构
答案 0 :(得分:2)
这是转动多列的更简单方法。
;WITH cte AS
(
SELECT [DeptCode],
[Approver],
'' AS [Alternate],
ROW_NUMBER() OVER (PARTITION BY DeptCode ORDER BY b.ProcessID) Rn
FROM TableB b
JOIN TableA a ON a.ProcessID = b.ProcessID
UNION ALL
SELECT [DeptCode],
'',
AlternateApprover,
ROW_NUMBER() OVER (PARTITION BY DeptCode ORDER BY b.ProcessID) Rn
FROM TableB b
JOIN TableC a ON a.ProcessID = b.ProcessID
)
SELECT [DeptCode],
MAX(CASE WHEN Rn = 1 THEN [Approver] END) AS FirstApprover,
MAX(CASE WHEN Rn = 1 THEN [Alternate] END) AS FirstAlternate,
MAX(CASE WHEN Rn = 2 THEN [Approver] END) AS SecondApprover,
MAX(CASE WHEN Rn = 2 THEN [Alternate] END) AS SecondAlternate
FROM cte
GROUP BY [DeptCode]
这假设第一个和第二个订单由ProcessID ROW_NUMBER() OVER (PARTITION BY DeptCode ORDER BY b.ProcessID)
确定,因为你有TableA中的Step而不是TableC我不确定该字段代表什么。