我有一个面向列的表,它指定了产品的制造选项。每个选项可以是以下选项的子集('','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多行,因此需要很长时间。如果我可以在解开之前消除所有空白选项,我认为它会运行得更快。
有人对如何在取消插入前过滤字段值有任何建议吗?
答案 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)