1

在我的 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

4 回答 4

10

您不能没有动态 SQL 并查询 information_schema 表或对其进行硬编码。你能重组你的数据吗,也许像下面这样?

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

编辑

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

  • 表中的最大列数为 1024,因此您不能为曾经发生的每个品牌/项目排列添加列。

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

  • 如果不对所有排列进行硬编码,并且在添加新品牌时记得更新该代码,您就无法进行简单的计算,例如对所有包进行求和。

  • 你根本不能做一些查询(或者至少不是没有很大的困难)——比如带回所有提供鞋子的品牌的名称。

于 2010-06-25T08:41:29.447 回答
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

但正如 Martin Smith 建议的那样,重组数据会更好。

于 2010-06-25T08:45:17.607 回答
1

好吧,我想尝试解决这个问题,因为我正在更深入地学习 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)
于 2010-06-27T19:43:31.210 回答
0
SELECT PERIOD, [Brand A small Bags] + [Brand A big bags] [Sum of Bags] ... etc
于 2010-06-25T08:42:18.190 回答