如何从 TSQL UNPIVOT 中过滤值?
Posted
技术标签:
【中文标题】如何从 TSQL UNPIVOT 中过滤值?【英文标题】:How do I filter values out of a TSQL UNPIVOT? 【发布时间】:2012-04-09 18:20:32 【问题描述】:我有一个面向列的表格,用于指定产品的制造选项。每个选项都可以是以下选项的子集(' '、'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】:您不能将WHERE
放在UNPIVOT
子句中,也不能在返回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)
【讨论】:
就是这样!它确实加快了查询速度。我得到了我想要的数据。谢谢!以上是关于如何从 TSQL UNPIVOT 中过滤值?的主要内容,如果未能解决你的问题,请参考以下文章