2016-12-02 3 views
1

Ich muss dynamisch Spalten erstellen, die basierend auf dem Laufvorkommen benannt werden. Wenn ich Daten als solche haben:Dynamische SQL-Spaltennamen basierend auf Ereignisreihenfolge

RunID TestID Status 
----- ------ ------ 
1  200  Passed 
2  200  Failed 
3  300  Failed 
4  400  Not Complete 
5  400  Passed 
6  400  Passed 

Was muss ich zurückkehren ist:

TestID Run1   Run2 Run3 
------ ----   ---- ---- 
200  Passed  Failed 
300  Failed 
400  Not Complete Passed Passed 

Ich kann zuerst alle Läufe nennen, aber über den Status Verschwenkung selbst im dynamischen Lauf auszurichten ist, wo ich Hau ab. Muss ich einen CTE verwenden, um die Läufe zu erhalten, dann einen, um die maximale Anzahl zu erhalten, die eine TestId aufgerufen wurde, und dann Spaltenstringnamen basierend auf 1 bis max (Anzahl (TestID)) zu erstellen? Wie bekomme ich das dann in Spalten, die den richtigen Status haben? Ist ein Drehpunkt sogar dort, wo ich sein muss?

Antwort

1

Wenn SQL Server.

Sie können die Fensterfunktion ROW_NUMBER() verwenden, um die unterschiedlichen Laufnummern zu bekommen, und dann laufen wir einfach eine dynamische Dreh für die endgültigen Ergebnisse

Declare @SQL varchar(max) 
Select @SQL = Stuff((Select Distinct ',' + QuoteName('Run'+cast(RN as varchar(25))) From (Select Distinct RN=Row_Number() over (Partition By TestID Order By RunID) from YourTable) A Order By 1 For XML Path('')),1,1,'') 
Select @SQL = 'Select TestID,' + @SQL + ' 
       From (
         Select TestID,Item=''Run''+cast(Row_Number() over (Partition By TestID Order By RunID) as varchar(25)),Value=Status 
         From YourTable 
        ) A 
       Pivot (max(Value) For Item in (' + @SQL + ')) p' 
Exec(@SQL); 

Returns

TestID Run1   Run2  Run3 
200  Passed   Failed NULL 
300  Failed   NULL  NULL 
400  Not Complete Passed Passed 

Bearbeiten

Select Stuff((Select ',' + QuoteName('Run'+cast(RN as varchar(25))) 
    From (Select Distinct Top 100 Percent RN=Row_Number() over (Partition By RN_TEST_ID Order By RN_RUN_ID) 
      From td.RUN 
      Where RN_CYCLE_ID = 501 
      Order By 1 
     ) A 
    For XML Path('')),1,1,'') code 
+0

Das ist perfekt! Danke, ich habe nicht mal eine XML PATH-Lösung betrachtet, um die Spaltennamen zu erstellen. Ich schätze, ich muss etwas mehr darüber nachdenken. Danke, John Cappelletti, du hast meine geistige Gesundheit gerettet. –

+0

@ S.G. Freue mich zu helfen. Ein Blick in den XML-Pfad und die Fensterfunktionen ist die Mühe wert. Prost :) –

+0

Gibt es eine Chance, dass Sie den besten Weg kennen, um die Spalten für "Run " in Reihenfolge zu halten? Um zu verhindern, dass "Run1" "Run10" passiert? Halten Sie auch "NULL" Werte mit dem tatsächlichen Lauf und nicht bis zum Ende geschoben? –

Verwandte Themen