2015-01-26 56 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和联合的所有结果。

在#SetValuesTable

数据看起来像:

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 

继续查询:

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

请发表您的预期输出 – 2015-01-26 23:43:58

+0

@BumbleBee从哪里得到'proprtytype'结果。 #SetValues中的数据没有这样的列。我也混淆了哪个表是输入的,哪一个是预期的输出 – 2015-01-27 01:32:37

+0

抱歉纠正了错字。 – BumbleBee 2015-01-27 01:36:41

回答

1

使用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。对于整个查询,输入是一串Mnums。我有几个步骤来完成这个查询。这是查询真正需要时间执行的地方。 1)通过ReportFieldsLookup加入上面得到的结果TAble 2)决赛桌中的Munms应该按照输入的顺序发送 – BumbleBee 2015-01-27 03:22:49