2012-04-09 30 views
2

我有一个指定产品的制造选项的列式表。每个选项可以是以下选项的一个子集('','B','L','R','BX','LX','RX)。该表有314列。 (这是一个遗留构建,而不是我今天做的方式......)如何过滤TSQL UNPIVOT中的值?

我有一个客户请求来计算一个选项在日期范围内使用的次数。获得过滤数据不是问题,但是将面向列的表转换为可计数的面向行的表正在挑战我的透视/不透明技能。

我能得到这个列名(从http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx参考)

declare @cols nvarchar(max) 

select @cols = coalesce(@cols + ',' + quotename(column_name), quotename(column_name)) 
from information_schema.columns where table_name = 'mfgOptions' 
    and data_type = 'char' and character_maximum_length 

大部分时间,选项有'值。我不想将这些包含在我的旋转表中。 我期望的结果是一个表,如:

MfgItemID | MfgOptionName | OptionSelection 
------------------------------------------- 
1000  | option1  | BX 
1000  | option2  | B 
2000  | option1  | LX 
2000  | option3  | RX 

使用上述@cols定义,我创建了以下UNPIVOT

declare @query nvarchar(max) 
set @query = N'SELECT MfgItemID, MfgOptionName, OptionSelection 
from (SELECT MfgItemID, ' + @cols + ' 
FROM mfgOptions) a 
UNPIVOT (OptionSelection for MfgOptionName IN (' + @cols + ')) AS u 
order by MfgItemID, MfgOptionName' 

EXECUTE(@query) 

此执行查询时,似乎主要是做什么,我需要的。然而,由于我在表格中有500,000多行,因此需要很长时间。如果我能够在排除前排除所有空白选项,我认为它运行得更快。

有没有人有任何建议如何过滤字段值unpivoting之前?

回答

3

您不能在UNPIVOT子句中放置WHERE,并且不能在返回a的子查询中过滤掉,因为该行可能存在其他有用的值。我知道你能做的最好的事情是UNPIVOT像这样后说WHERE u.OptionSelection <> ' '

declare @query nvarchar(max) 
set @query = N'SELECT MfgItemID, MfgOptionName, OptionSelection 
from (SELECT MfgItemID, ' + @cols + ' 
FROM mfgOptions) a 
UNPIVOT (OptionSelection for MfgOptionName IN (' + @cols + ')) AS u 
WHERE u.OptionSelection <> '' '' 
order by MfgItemID, MfgOptionName' 

EXECUTE(@query) 
+0

这就是它!它确实加快了查询速度。我得到了我想要的数据。谢谢! – 2012-04-09 18:48:57