2016-12-02 5 views
1

실행 발생을 기반으로 이름이 지정된 열을 동적으로 만들어야합니다. 나는 다음과 같은 데이터가있는 경우 :이벤트 순서에 따른 SQL 동적 열 이름

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

내가 반환해야하는 것입니다 :

이 가 가

내가 먼저 모든 실행을 호출 할 수 있지만 상태를 선회하는 동적 실행 자체를 정렬이 어디

TestID Run1   Run2 Run3 
------ ----   ---- ---- 
200  Passed  Failed 
300  Failed 
400  Not Complete Passed Passed 
I 꺼져. 실행을 얻으려면 CTE를 사용해야하며, TestId가 호출 된 최대 개수를 얻은 다음 1에서 max (count (TestID))를 기준으로 열 문자열 이름을 작성해야합니까? 올바른 상태를 유지하는 열에 어떻게 가져올 수 있습니까? 내가 있어야 할 곳에 피벗이 있습니까?

답변

1

SQL Server의 경우.

당신은 별개의 실행 번호를 얻기 위해 윈도우 함수의 ROW_NUMBER()를 사용할 수 있으며, 우리는 단순히

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

반환

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

을 최종 결과에 대한 동적 피벗을 실행 수정

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

이것은 완벽합니다! 고맙습니다. 열 이름을 빌드하는 XML PATH 솔루션을 검토하지 않았습니다. 나는 이것을 좀 더 조사 할 필요가있을 것 같다. John Cappelletti 당신이 내 정신을 구 했으니 고맙습니다. –

+0

@ S.G. 도와 줄 수있어서 기뻐. XML Path와 Window 함수를 살펴 보는 것은 그만한 가치가 있습니다. 건배 : –

+0

""의 순서대로 열을 유지하는 가장 좋은 방법은 알고 계실 것입니다. "Run1" "Run10"이 발생하지 않도록하려면? 또한 "NULL"값을 실제 실행으로 유지하면서 끝까지 밀어 넣지 않습니까? –