2012-03-08 136 views
1

我有以下查詢,您可以看到多個Count(CompetitorID)調用。這是一個性能問題,還是SQL Server 2008'緩存'Count?如果這是性能問題,是否可以存儲Count以防止多次查找?在SELECT查詢中防止重複COUNT

SELECT EventID,Count(CompetitorID) AS NumberRunners, 
    CASE WHEN Count(CompetitorID)<5 THEN 1 
     WHEN Count(CompetitorID)>=5 AND Count(CompetitorID)<=7 THEN 2 
     ELSE 3 END AS NumberPlacings 
FROM Comps 
GROUP BY EventID Order By EventID; 
+0

雖然語法看起來像是在重複某個操作,但查詢分析器可能會優化它。 – HABO 2012-03-08 02:26:02

回答

2

它總是一個更好的做法,只要有可能的話就得到一次值並隨後使用它。你的情況,你總是可以使用內部查詢,以獲得數只有一次,計算等(衍生)列了它的值,如下圖所示:

SELECT EventID, NumberRunners, 
     CASE WHEN NumberRunners <5 THEN 1 
      WHEN NumberRunners >=5 AND NumberRunners <=7 THEN 2 
      ELSE 3 
     END AS NumberPlacings 
    FROM (
      SELECT EventID, 
        NumberRunners = Count(CompetitorID) 
       FROM Comps 
      GROUP BY EventID 
     ) t 
Order By EventID; 
+0

謝謝Akhil,我認爲這是不好的多次計數。 – 2012-03-08 00:25:09

0

簡單的將是這樣:

SELECT事件ID,次數(不同CompetitorID)AS NumberRunners, CASE WHEN計數(不同CompetitorID)< 5 THEN 1 當計(不同CompetitorID)> = 5和COUNT(DISTINCT CompetitorID)< = 7 THEN 2 ELSE 3 END AS NumberPlacings FROM譜曲 GROUP BY EventID Order By EventID;