2016-06-22 19 views
0

Ich arbeite in SQL Server (SSMS) mit drei Tabellen wie soSQL Pivot aus mehreren Tabellen und Spalten

Tabelle A

ProcessID Step Approver 
    17  10 Kim 
    18  20 Joe 
    19  10 Beth 
    20  20 Josh 

Tabelle B

ProcessID DeptCode 
    17  515 
    18  515 
    19  190 
    20  190 

Tabelle C

ProcessID AlternateApprover 
    17  Sarah 
    18  David 
    19  Don 
    20  Don 

und möchte meine Ergebnisse formatiert:

DeptCode FirstApprover FirstAlternate SecondApprover SecondAlternate 
    515  Kim   Sarah   Joe    David 
    190  Beth   Don   Josh   Don 

ich einen Dreh auf nur den Genehmiger erfolgreich geschafft haben, aber ich bin nicht sicher, wie das Verbinden der Stellvertreter (Tabelle C) zu gehen.

Ich verstehe, dass diese Normalisierung ein wenig seltsam - es ist nicht meine Datenbank ist, und ich habe keine Kontrolle über die Tabellenstruktur

+2

Welche SQL hast du bisher? – nerdlyist

Antwort

2

dies einfacher Weg ist, mehrere Spalten zu schwenken.

;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] 

dies setzt voraus, dass erste und zweite Ordnung von ProcessID bestimmt werden ROW_NUMBER() OVER (PARTITION BY DeptCode ORDER BY b.ProcessID) da Sie Schritt in TableA hat aber nicht TableC Ich bin mir nicht sicher, was das Feld darstellt.

+0

Das hat genauso funktioniert wie ich gebraucht habe danke! Ich sortiere durch Schritt in TableA, also änderte ich die eine Zeile zu ROW_NUMBER() OVER (PARTITION DURCH DeptCode ORDER BY a.Step) Rn in beiden und fügte eine zweite JOIN-TabelleA a ON a.ProcessID = b.ProcessID hinzu – Katelyn