2015-03-24 3 views
0

Я пытаюсь создать простой индексированный вид по запросу ниже. Но когда я пытаюсь создать уникальный кластерный индекс на нем, я получаю следующее сообщение об ошибке:SQL Server Indexed Views: не удается создать кластеризованный индекс, потому что список выбора содержит выражение в результате функции агрегата

Cannot create the clustered index '..' on view '..' because the select list of the view contains an expression on result of aggregate function or grouping column. Consider removing expression on result of aggregate function or grouping column from select list.

Запрос я использовал следующие:

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.

+0

Вы не можете создать индекс на основе агрегированных данных (т.е. SUM (BackOrders $)), потому что тогда каждый раз, когда вы изменяли базовую таблицу, индекс должен был повторно группировать/вычислять, а затем обновлять. Вы можете создать индекс в базовой таблице рейтинга с использованием столбцов, которые вы используете (fixSBU и [DC Name]), и это должно помочь вещи, если таблица большая, иначе забудьте индекс. – mohan111

+0

@ mohan111, хотя базовые данные могут измениться, сумма по-прежнему является детерминированной функцией - поскольку она возвращает одинаковые результаты каждый раз, когда предоставляются одни и те же базовые данные. Я думаю, что это все равно должно работать (по крайней мере, из-за суммы) – Kritner

ответ

1

Вот ссылка на все ограничения с точки зрения индекса: 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)). Вам нужно СУММА ИСУЛЛ, а не наоборот.

+0

Я попытался использовать что-то вроде этого: 'ISNULL (SUM ([QAV]), 0)/COUNT_BIG (*) как AvgQAV' в инструкции SELECT. Это тоже не работает. Я попробую модификацию ISNULL, которую вы предложили. Спасибо! – user2673722

+0

Я изменил инструкцию ISNULL и ввел еще один запрос COUNT_BIG (*) в запрос, но я все равно получаю ту же ошибку. 'Select [Производитель] , SUM (ISNULL ([QAV], 0))/COUNT_BIG (*) в качестве AvgQAV , SUM (IsNull ([невыполненные $], 0))/COUNT_BIG (*), как AvgBackorder $ , DATEPART (год, [Дата]) в качестве года, DATEPART (месяц, [Дата]) в месяц , [fixSBU] , [Имя DC] \t, COUNT_BIG (*) AS NumRows ОТ [Table1] Group By [Производитель] , DATEPART (год, [Дата]) , DATEPART (месяц, [Дата]) [fixSBU] , [Имя DC] ' – user2673722

+0

Я избавилась от выражения в приведенном выше запросе' (SUM (ISNULL ([BackOrders $], 0))/COUNT_BIG (*)) ', изменено ISNULL и создал отдельный COUNT_BIG (*) - это сработало! Большое спасибо! – user2673722

0

не делает много смысла (по крайней мере, не для меня), но ссылка: https://msdn.microsoft.com/en-us/library/ms191432.aspx

В частности:

If GROUP BY is present, the VIEW definition must contain COUNT_BIG(*) and must not contain HAVING. These GROUP BY restrictions are applicable only to the indexed view definition. A query can use an indexed view in its execution plan even if it does not satisfy these GROUP BY restrictions.

попробовать добавить COUNT_BIG(*) в свой список выбора и дать ему кружить ,

+0

Я тоже пытался использовать COUNT_BIG (*). Это тоже не работает. Как только я удаляю функцию sum из SELECT, я могу создать уникальный кластерный индекс, но здесь есть ключевые слова. 'ВЫБРАТЬ [Производитель] , ISNULL (SUM ([QAV]), 0)/COUNT_BIG (*) в качестве AvgQAV , IsNull (SUM ([невыполненные $]), 0)/COUNT_BIG (*) в качестве AvgBackorder $ , DATEPART (год, [Дата]) в качестве года, DATEPART (месяц, [Дата]) в месяц , [fixSBU] , [Имя DC] ОТ [Table1] Group By [Производитель] , DATEPART (год, [Дата]) , DATEPART (месяц, [Дата]) , [fixSBU] , [DC Name] ' – user2673722

+0

@ user2673722: кажется довольно простым для меня. Вы не можете использовать агрегированные функции в индексированных представлениях. Это в документах, и сообщение об ошибке понятное. Что еще мы можем сделать? – siride

+0

@siride вы можете использовать агрегаты в виде индекса. Один из них просто должен быть COUNT_BIG, и ему нужно, чтобы SUM был ISNULL, против ISNULL SUM. – zgirod

0

У меня была аналогичная проблема. Один из моих избранных полей выглядит следующим образом:

sum(Pa * (CTRatio1a/CTRatio2a) * (VTRatio1/VTRatio2)* Polarity * [Percentage])/1000.0 

Включив последнее деление на 1000 в кронштейне, то проблема решена:

sum(Pa * (CTRatio1a/CTRatio2a) * (VTRatio1/VTRatio2)* Polarity * [Percentage]/1000.0) 

 Смежные вопросы

  • Нет связанных вопросов^_^