さて、私はSQLをより深く学んでいるので、自分自身の演習としてこれを解決しようとしました。与えられたスキーマの問題は十分に文書化されているので、それについて他に何も言うことはないと思います。
このコードが機能するには、ソース データの列が物理的な列である必要があります (つまり、テーブル変数やビューの列ではありません)。バッグや靴以外のタイプがあれば、このコードを関数などに抽象化できます。アルゴリズム的なものを取り下げたかっただけです。これが適切に機能するためには他にも多くの注意事項がありますが、前述のように、非正規化データにはすべての注意事項があります。
だからここに行きます:
編集:バージョン 2. これを手伝ってくれた Martin に感謝します。これは非常に巧妙なトリックですが、使用する必要があるのはおそらくまれなことです。
列名が検索パターンと一致すると想定しています (十分にハードコーディングされているため、わざわざチェックする必要はありません)。
DECLARE @sql nvarchar(max)
SET @sql = 'SELECT Period, '
-- Build column sum for bags
DECLARE @bagsColumns nvarchar(max)
SELECT
@bagsColumns = COALESCE(@bagsColumns + '+', N'') + '[' + COLUMN_NAME + ']'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'SumTest' AND COLUMN_NAME LIKE '%bags%'
SET @sql = @sql + @bagsColumns + ' AS ''Sum of Bags'', '
-- Build column sum for shoes
DECLARE @shoesColumns nvarchar(max)
SELECT
@shoesColumns = COALESCE(@shoesColumns + '+', N'') + '[' + COLUMN_NAME + ']'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'SumTest' AND COLUMN_NAME LIKE '%shoes%'
SET @sql = @sql + @shoesColumns + ' AS ''Sum of Shoes'''
SET @sql = @sql + ' FROM SumTest'
EXEC(@sql)