2

製品の製造オプションを指定する列指向の表があります。各オプションは、次の選択肢 (' '、'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 行以上あるため、非常に時間がかかります。ピボットを解除する前に空白のオプションをすべて削除できれば、はるかに高速に実行できると思います。

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

4

1 に答える 1

3

行に有用な他の値がある可能性があるためWHERE、句の中に入れることはできずUNPIVOT、返されるサブクエリで除外することもできません。aあなたができることを私が知っている最も良いことは、次WHERE u.OptionSelection <> ' '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
WHERE u.OptionSelection <> '' ''
order by MfgItemID, MfgOptionName'

EXECUTE(@query)
于 2012-04-09T18:44:54.347 に答える