如何从 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 中过滤值?的主要内容,如果未能解决你的问题,请参考以下文章

TSQL - 来自 Excel 导入数据的 UNPIVOT

TSQL - 使用 UNPIVOT 的帮助

TSQL PIVOT/UNPIVOT 多个汇总列

TSQL - 过滤组,如果它包含所有空

使用 TSQL OPENJSON 如何从具有动态键名的 JSON 数组中提取值

使用 TSQL 从 XML 中删除具有特定值的节点