好吧,我想尝试解决这个问题,因为我正在更深入地学习 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)