Что ж, я хотел попытаться решить эту проблему в качестве упражнения для себя, потому что я изучаю SQL более подробно.Я думаю, что проблемы с данной схемой достаточно хорошо задокументированы, чтобы я больше ничего об этом не говорил.
Чтобы этот код работал, столбцы в исходных данных должны быть физическими столбцы (т. е. не табличная переменная или столбцы в представлении).Вы можете абстрагировать этот код в функции и еще много чего, если есть больше типов, чем просто сумки и обувь.Я просто хотел разобраться с алгоритмическими вещами.Есть много других предостережений для правильной работы, но, как уже упоминалось, денормализованные данные также имеют полный набор предостережений.
Итак, мы идем:
РЕДАКТИРОВАТЬ: Версия 2. Спасибо Мартину за помощь в этом.Это действительно изящный трюк, хотя, вероятно, его нужно использовать редко.
Я предполагаю, что имена столбцов будут соответствовать шаблону поиска (он достаточно жестко задан, поэтому зачем проверять).
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)