私は製品の製造オプションを指定する列指向のテーブルを持っています。各オプションは、以下の選択肢( ''、 '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以上の行があるため、非常に時間がかかります。私がピリオドをかける前にすべての空白のオプションを取り除くことができれば、はるかに速く動くと思う。
誰も、ピボット解除する前にフィールド値をフィルタリングする方法について提案はありますか?
:私はあなたができることを知って最善のことはそうのような
UNPIVOT
後WHERE u.OptionSelection <> ' '
を言っています!間違いなくクエリが高速化しました。そして、私が望むデータを得ました。ありがとう! –