2010-11-04 3 views
0

Я использую SQL Server 2005 SP3 Standard Edition, но не могу создать индексированное представление (попытка создания кластерного индекса на MeasurementDataID). Я знаю, что стандартная версия не использует индексированные представления в запросе, если не используется подсказка для запроса noexpand.SQL Server не может создавать индексированные представления

Error message -- because view reference an unknown value sum aggregate of nullable expression

Кроме того, зачем мне нужно count_big (*) ??

CREATE VIEW [CPSync].[vwGetColorChars] WITH SCHEMABINDING 
AS 
    SELECT MC.MeasurementDataID 
     , SUM(CASE WHEN CC.ColorCharID = 11 THEN [ColorCharsValue] END) AS [Gray_a*] 
     , SUM(CASE WHEN CC.ColorCharID = 12 THEN [ColorCharsValue] END) AS [Gray_b*] 
     , SUM(CASE WHEN CC.ColorCharID = 4 THEN [ColorCharsValue] END) AS [ΔF] 
     , SUM(CASE WHEN CC.ColorCharID = 9 THEN [ColorCharsValue] END) As DotGain 
     , SUM(CASE WHEN CC.ColorCharID = 10 THEN  [ColorCharsValue] END) As [Gray_L*] 
     , SUM(CASE WHEN CC.ColorCharID = 13 THEN  [ColorCharsValue] END) As [G7NPDC] 
     , COUNT_BIG(*) AS CountBig 
FROM CPSync.Measurement 
INNER JOIN CPSync.MeasurementData ON Measurement.MeasurementID = MeasurementData.MeasurementID 
INNER JOIN CPSync.MeasuredColorChar As MC ON MC.MeasurementDataID = MeasurementData.MeasurementDataID 
INNER JOIN CPSync.ColorChar AS CC ON MC.ColorCharsID =CC.ColorCharID 
Group By MC.MeasurementDataID 

ответ

4

Изменение линии, как

SUM(CASE WHEN CC.ColorCharID = 11 THEN [ColorCharsValue] END) AS [Gray_a*] 

к

SUM(CASE WHEN CC.ColorCharID = 11 THEN [ColorCharsValue] ELSE 0 END) AS [Gray_a*] 

COUNT_BIG: если позволяет материализованные строк, которые необходимо отслеживать. Подобно «uniquifier» в не-unqiue кластерном индексе. COUNT_BIG позволяет 32-битное переполнение для больших просмотров.

+0

Я пытался, но получил ту же ошибку я изменил все операторы case, такие как , SUM (CASE WHEN CC.ColorCharID = 11 THEN [ColorCharsValue] ELSE 0 END) AS [Gray_a *] – cshah

+0

точное сообщение об ошибке после изменения ll case statement ELSE 0 Невозможно создать кластерный индекс «IX_MeasuremnetDataID» в представлении «vwGetColorChars», потому что представление ссылается на неизвестное значение (агрегирование SUM с нулевым выражением). Рассмотрите возможность ссылки только на значения, не имеющие значения NULL в SUM. ISNULL() может быть полезна для этого. (Microsoft SQL Server, ошибка: 8662). Для получения справки нажмите: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.4053&EvtSrc=MSSQLServer&EvtID=8662&LinkId=20476 ------- ----------------------- КНОПКИ: ОК ------------------------ ------ – cshah

+1

Использовать isnull (ColorCharsValue, 0), то? – Arvo

0

В качестве альтернативы, вы можете заменить это:

SELECT MC.MeasurementDataID 
    , SUM(CASE WHEN CC.ColorCharID = 11 THEN [ColorCharsValue] END) AS [Gray_a*] 
    , SUM(CASE WHEN CC.ColorCharID = 12 THEN [ColorCharsValue] END) AS [Gray_b*] 
    , SUM(CASE WHEN CC.ColorCharID = 4 THEN [ColorCharsValue] END) AS [ΔF] 
    , SUM(CASE WHEN CC.ColorCharID = 9 THEN [ColorCharsValue] END) As DotGain 
    , SUM(CASE WHEN CC.ColorCharID = 10 THEN  [ColorCharsValue] END) As [Gray_L*] 
    , SUM(CASE WHEN CC.ColorCharID = 13 THEN  [ColorCharsValue] END) As [G7NPDC] 
    , COUNT_BIG(*) AS CountBig 

с этим простым кодом:

SELECT MC.MeasurementDataID, 
    , CC.ColorCharID 
    , SUM([ColorCharsValue]) AS [yourColumnName] 
    , COUNT_BIG(*) AS CountBig 

и повернуть его, когда вы выбираете из вашего индексированного представления

+0

Что вы подразумеваете под «PIVOT IT», когда вы выбираете из своего индексированного представления? Можете ли вы показать нам, как это будет выглядеть? –

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