如何从TSQL UNPIVOT中过滤值?

时间:2012-04-09 18:20:33

标签: sql-server sql-server-2005 unpivot

我有一个面向列的表,它指定了产品的制造选项。每个选项可以是以下选项的子集('','B','L','R','BX','LX','RX)。该表有314列。 (这是遗留的构建,而不是我今天的方式......)

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

我可以用这个来获取列名(从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多行,因此需要很长时间。如果我可以在解开之前消除所有空白选项,我认为它会运行得更快。

有人对如何在取消插入前过滤字段值有任何建议吗?

1 个答案:

答案 0 :(得分:3)

您不能在WHERE子句中放置UNPIVOT,并且无法在返回a的子查询中过滤掉,因为行上可能还有其他值有用。我知道你能做的最好的事情就是在WHERE u.OptionSelection <> ' '之后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
WHERE u.OptionSelection <> '' ''
order by MfgItemID, MfgOptionName'

EXECUTE(@query)