SQL Server:如果列的名称包含单词,如何SUM列值?

时间:2010-06-25 08:36:11

标签: sql sql-server sum calculated-columns

在我的SQL表中:

Period| Brand A small Bags| Brand A big bags| Brand D Shoes| ...|  Brand X Shoes
2010  |   10              | 20              | 30           | ...| 200           

如何对列名称中包含某些单词(例如鞋子)的列进行求和?

预期结果:

Period | Sum of Bags | Sum of Shoes | ..
2010   | 30          | 230          | ..

4 个答案:

答案 0 :(得分:10)

您不能没有动态SQL并查询information_schema表或对其进行硬编码。您可以重构您的数据,也许是以下内容吗?

Brands (BrandId, BrandName)
ItemTypes (ItemId, ItemName)
Stock(BrandId, ItemId, Period, Quantity)

修改

可能还有更多的原因,但是这里有一些原因导致您当前的表结构存在问题。

  • 表格中的最大列数为1024,因此您无法为每次出现的品牌/项目排列添加列。

  • 如果一个品牌生产包包和鞋子,您将多次重复有关该品牌的信息。任何时候重复这样的信息都有可能会出现轻微的差异和异常现象。此外,如果品牌更改了名称,您需要更新列以及所有引用它的代码。

  • 您无法进行简单的计算,例如在不对所有排列进行硬编码的情况下对所有行李进行求和,并在添加新品牌时记住更新该代码。

  • 你根本不能做任何疑问(或者至少没有很大的困难) - 例如带回所有供应鞋子的品牌名称。

答案 1 :(得分:2)

您不能在列名称上使用通配符(仅限内容)。

列数不应更改,因此您可以按以下方式构建查询:

select period, sum([Brand A small bags]) + sum([Brand A big bags]) as [sum of bags],
   sum([Brand D shoes]) + sum([Brand X shoes]) as [sum of shoes]
from yourtable
group by period

但正如马丁史密斯建议的那样重组数据会更好。

答案 2 :(得分:1)

好吧,我想尝试解决这个问题,因为我正在更深入地学习SQL。我认为给定模式的问题已经足够详细记录,对我来说没有其他任何相关内容。

要使此代码生效,源数据中的列必须是 physical 列(即,不是表变量或视图中的列)。如果有更多的类型而不仅仅是包包和鞋子,你可以将这些代码抽象为函数和诸如此类的东西。我只想把算法的东西搞定。还有许多其他注意事项可以正常工作,但正如已经提到的那样,非规范化数据也有一整套警告。

所以我们走了:

编辑:版本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)

答案 3 :(得分:0)

SELECT PERIOD, [Brand A small Bags] + [Brand A big bags] [Sum of Bags] ... etc