【发布时间】:2015-05-27 05:25:50
【问题描述】:
我正在尝试为下面的查询创建一个简单的索引视图。但是,当我尝试在其上创建唯一聚集索引时,出现以下错误:
无法在视图“..”上创建聚集索引“..”,因为选择 视图列表包含聚合结果的表达式 功能或分组列。考虑删除结果表达式 选择列表中的聚合函数或分组列。
我使用的查询如下:
SELECT
[Manufacturer]
,ISNULL(SUM([QAV]),0) as AvgQAV
,ISNULL(SUM([BackOrders$]),0)as AvgBackorder$
,DATEPART(year,[Date])as Year
,DATEPART(month,[Date])as Month
,[fixSBU]
,[DC Name]
FROM [dbo].[TABLE1]
Group By
[Manufacturer]
,DATEPART(year,[Date])
,DATEPART(month,[Date])
,[fixSBU]
,[DC Name]
谁能告诉我这可能的原因?
如您所见,我已经在使用ISNULL 函数。
【问题讨论】:
-
您不能基于聚合数据(即 SUM(BackOrders$))创建索引,因为每次修改基础表时,索引都必须重新分组/计算然后更新。您可以使用您正在使用的列(fixSBU 和 [DC 名称])在基础评级表上创建索引,如果表很大,这应该会有所帮助,否则会忘记索引。
-
@mohan111 尽管基础数据可能会发生变化,但 sum 仍然是一个确定性函数 - 因为每次提供相同的基础数据时它都会返回相同的结果。我认为这应该仍然有效(至少由于总和)
-
只是为了澄清你 100% 可以根据聚合数据创建索引。您必须小心 - SELECT SUM(Total) - SUM(Discount) AS SubTotal 是不允许的,但 SELECT SUM(Total - Discount) AS SubTotal 是。
标签: sql-server clustered-index indexed-view