SQL 从多个表和列进行数据透视
SQL Pivot from multiple tables and columns
我在 SQL 服务器 (SSMS) 中使用三个 table 像这样
Table一个
ProcessID Step Approver
17 10 Kim
18 20 Joe
19 10 Beth
20 20 Josh
Table乙
ProcessID DeptCode
17 515
18 515
19 190
20 190
Table 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
我已经成功地管理了仅审批者的支点,但我不确定如何加入候补者 (Table C)。
我知道这种规范化有点奇怪 - 它不是我的数据库,我无法控制 table 结构
这是旋转多列的更简单方法。
;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 我不确定该字段代表什么。
我在 SQL 服务器 (SSMS) 中使用三个 table 像这样
Table一个
ProcessID Step Approver
17 10 Kim
18 20 Joe
19 10 Beth
20 20 Josh
Table乙
ProcessID DeptCode
17 515
18 515
19 190
20 190
Table 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
我已经成功地管理了仅审批者的支点,但我不确定如何加入候补者 (Table C)。
我知道这种规范化有点奇怪 - 它不是我的数据库,我无法控制 table 结构
这是旋转多列的更简单方法。
;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 我不确定该字段代表什么。