2015-01-26 8 views
1

foreach크로스 적용 사용하여 테이블을 통해 루프 및 UNION ALL 결과

쿼리처럼 행동하는 쿼리를 작성하려고 :

select label ,NTILE(10) over(order by label ASC) Quartile INTO #labelTempTab from dbo.ReportFieldsLookup 

데이터가 될 것 같은 :

label Quartile 
----- -------- 
la1   1 
la2   1 
la3   1 
sa1   2 
sa2   2 
sq3   2 
ha1   3 
ha2   3 
ha3   3 
ka1   4 
ka2   4 
kas3  4 

검색어의 연속 :

DECLARE @sql nvarchar(max) 

SELECT * INTO #SetValuesTable FROM svo_tbl 

SET @sql = 'SELECT MNUM, Label , LabelValue ,[Property Type] FROM #SetValuesTable ' 
       +' CROSS APPLY (VALUES ' 
       + stuff((SELECT ',('''+ replace(C.label,'''','"') + ''',' + quotename(C.label) + ')' FROM #labelTempTab c WHERE c.Quartile = 1 group by label FOR xml path('')), 1, 1, '') 
       +') AS UPTab (Label , LabelValue);' 

EXEC(@sql) 

위의 쿼리는 에 대해서만 피벗 해제되지 않습니다. 어떻게하면 1에서 n까지 작동하게하고 모든 결과를 결합 할 수 있습니까?

MNUM  la1 la2  la3 sa1 sa2  sq3 ha1  ha2 ha3 ka1 ka2 Property Type 
12   1  0  2  1 0  8  3  4  0  1  2 s 
13   4  0  5  1 6  8  5  2  1  1  3 p 

결과 (예상 출력) 쿼리

MNUM Label LabelValue Property Type 
12  la1  1   s 
12  la2  0   s 
12  la3  2   s 
12  sa1  1   s 
12  sa2  0   s 
12  sa3  8   s 

........ 

13  ka1  1   p 
13  ka2  1   p 
12  ka3  3   p 

연속 같아야 : 같이 #SetValuesTable에

데이터 모양

SET @sql = @sql + ' INNER JOIN dbo.ReportFieldsLookup tt ON tt.label = Label' 
SET @sql = @sql + 'INNER JOIN dbo.SplitStrings_Ordered('''''09-404811,10-433495,10-433575,10-423789'''', ',') AS s ON #SetValuesTable.MNum = s.MNum ORDER BY s.[Index]; 

상기 두 진술은 오랜 시간이 걸립니다. 특히 정렬을위한 마지막 내부 조인은 오랜 시간이 걸립니다. 교차 적용을 사용하면 실행 시간이 크게 단축 될 수 있다고 생각합니다.

+0

당신이 존재하는 모든 레이블이 있는지 확인하십시오 당신의 예상을 게시하시기 바랍니다 출력 –

+0

@ BumbleBee 결과에서'proprtytype'을 얻은 곳. 'SetValues의 데이터 '에는 그러한 열이 없습니다. 또한 어떤 테이블이 입력되고 어느 것이 예상되는지 혼란 스럽습니다. –

+0

미안하지만 오타가 수정되었습니다. – BumbleBee

답변

1

결과를 unpivot하려면 Cross Apply을 사용하십시오. 동적 쿼리 쿼리는이 형식으로 구성되어야합니다.

SELECT mnum, 
     label, 
     label_value, 
     [Property Type] 
FROM #SetValuesTable 
     CROSS apply(VALUES ('la1',la1),('la2',la2),('la3',la3), 
          ('sa1',sa1),('sa2',sa2),('sa3',sa3), 
          ('ha1',ha1),('ha2',ha2),('ha3',ha3), 
          ('ka1',ka1),('ka2',ka2)) cs (label, label_value) 

Dynamic query

DECLARE @label VARCHAR(max)='', 
     @sql NVARCHAR(max) 

SELECT @label += '(' + '''' + label + ''',' + label + '),' 
FROM (SELECT DISTINCT Isnull(label, '') label 
     FROM #labelTempTab)a 

SELECT @label = LEFT(@label, Len(@label) - 1) 

SET @sql= 'SELECT mnum, 
      label, 
      label_value, 
      [Property Type] 
    FROM #SetValuesTable 
      CROSS apply(VALUES ' + @label 
      + ') cs (label, label_value) ' 

EXEC Sp_executesql @sql 

참고과 같이해야한다 : 당신이 #labelTempTab 테이블에서 값 목록을 생성하기 때문에#SetValuesTable 테이블

+0

감사합니다. NoDisplayName. 이 전체 쿼리의 경우 입력은 Mnum 문자열입니다. 이 쿼리를 수행하는 데 몇 가지 단계가 더 있습니다. 여기서 쿼리가 실제로 실행되는 데 걸리는 시간입니다. 1) 위의 결과를 ReportFieldsLookup TAble에 가입하십시오. 2) 최종 테이블의 Munms 순서대로 입력을 보내야합니다. – BumbleBee