는 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];
상기 두 진술은 오랜 시간이 걸립니다. 특히 정렬을위한 마지막 내부 조인은 오랜 시간이 걸립니다. 교차 적용을 사용하면 실행 시간이 크게 단축 될 수 있다고 생각합니다.
당신이 존재하는 모든 레이블이 있는지 확인하십시오 당신의 예상을 게시하시기 바랍니다 출력 –
@ BumbleBee 결과에서'proprtytype'을 얻은 곳. 'SetValues의 데이터 '에는 그러한 열이 없습니다. 또한 어떤 테이블이 입력되고 어느 것이 예상되는지 혼란 스럽습니다. –
미안하지만 오타가 수정되었습니다. – BumbleBee