SQL Server 索引视图:无法创建聚集索引,因为选择列表包含聚合函数结果的表达式

use*_*722 4 sql-server clustered-index indexed-view

我正在尝试在下面的查询中创建一个简单的索引视图。但是当我尝试在其上创建唯一的聚集索引时,出现以下错误:

无法在视图“..”上创建聚集索引“..”,因为视图的选择列表包含关于聚合函数或分组列的结果的表达式。考虑从选择列表中删除聚合函数或分组列结果的表达式。

我使用的查询如下:

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]
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这可能的原因?如您所见,我已经在使用该ISNULL功能。

zgi*_*rod 5

这是索引视图的所有限制的链接:https : //msdn.microsoft.com/en-us/library/ms191432.aspx#Restrictions

从文档中,这两项应该突出:

  • 如果存在 GROUP BY,则 VIEW 定义必须包含 COUNT_BIG(*) 并且不得包含 HAVING。这些 GROUP BY 限制仅适用于索引视图定义。查询可以在其执行计划中使用索引视图,即使它不满足这些 GROUP BY 限制。
  • 如果视图定义包含 GROUP BY 子句,则唯一聚集索引的键只能引用 GROUP BY 子句中指定的列。

此外,您需要更改 ISNULL 语句。现在你有 ISNULL(SUM([BackOrders$]),0) 并且它应该是 SUM(ISNULL([BackOrders$], 0))。您需要对 ISNULL 求和,而不是相反。