2012-04-09 12 views
2

私は製品の製造オプションを指定する列指向のテーブルを持っています。各オプションは、以下の選択肢( ''、 'B'、 'L'、 'R'、 'BX'、 'LX'、 'RX')のサブセットです。テーブルには314の列があります。 (これは旧式のビルドであり、今日のやり方ではありません...)TSQL UNPIVOTから値をフィルタリングする方法を教えてください。

日付の範囲内でオプションが使用された回数をカウントするというお客様のリクエストがあります。フィルタリングされたデータを取得することは問題ではありませんが、列指向の表をカウント可能な行指向の表に変換することは、ピボット/アンピボットスキルには挑戦しています。

私は

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 

http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspxから参照される)これで時間のほとんどをカラム名を取得することができ、オプションは「」値を持っています。私はピボットテーブルにこれらを含めたくありません。 私の望ましい結果は表のようなものです:上記@cols定義を使用して

MfgItemID | MfgOptionName | OptionSelection 
------------------------------------------- 
1000  | option1  | BX 
1000  | option2  | B 
2000  | option1  | LX 
2000  | option3  | RX 

、私はこのクエリを実行すると、ほとんど私が必要なものを行うには表示され、次の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以上の行があるため、非常に時間がかかります。私がピリオドをかける前にすべての空白のオプションを取り除くことができれば、はるかに速く動くと思う。

誰も、ピボット解除する前にフィールド値をフィルタリングする方法について提案はありますか?

答えて

3

UNPIVOT句の中にWHEREを置くことはできません。aを返すサブクエリでは、その行に有用な値が存在する可能性があるため、除外できません。それだ

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

:私はあなたができることを知って最善のことはそうのようなUNPIVOTWHERE u.OptionSelection <> ' 'を言っています!間違いなくクエリが高速化しました。そして、私が望むデータを得ました。ありがとう! –

関連する問題