2012-04-09 84 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