尝试编写一个行为类似于foreach
查询:
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)
以上查询仅针对Quartile = 1
进行取消注册
我怎样才能使它适用于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
继续查询:
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 :(得分: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
表中包含所有标签