来自多个表和列的SQL Pivot

时间:2016-06-22 18:26:10

标签: sql sql-server pivot-table ssms-2014

我在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)。

我知道这种规范化有点奇怪 - 它不是我的数据库而且我无法控制表结构

1 个答案:

答案 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我不确定该字段代表什么。

相关问题