2016-09-26 47 views
1

假設我有這樣執行函數多次或創建存儲過程

SELECT 
    ROW_NUMBER() OVER (ORDER BY T1.FinalScore desc) as Position, 
    T1.Employee, T1.FinalScore 
FROM 
    (SELECT 
     Position, Employee, AVG(Score) as FinalScore 
    FROM 
     dbo.Answers 
    WHERE 
     DATEPART(year, EvaluationDate) = @Year 
    GROUP BY 
     Employee) as T1 

這是一個函數會返回一個表像這樣:

|--------|----------|-------| 
|Position| Employee | FScore| 
|========|==========|=======| 
| 1 | John | 5.6 | 
| 2 | Tom | 4.8 | 
| 3 | Paul | 3.6 | 
| 4 | Mark | 2.0 | 

現在我需要創建一個具有一個趨勢圖以前的表格,加上前幾年的信息。

我的問題是,什麼是最好的做法,我應該從我的asp.net頁面多次調用我的函數來檢索多個表格,並處理我的頁面上的信息。

或者我應該創建一個存儲過程多次執行此函數並將數據插入臨時表?就像這樣:

CREATE TABLE #TOP 
(
    Position int, 
    Employee nvarchar(60), 
    Score decimal(18,2) 
) 

DECLARE @Flag as int 

SET @Flag = @Year - 3 

WHILE (@Year > @Flag) 
BEGIN 
    INSERT INTO #TOP 
     SELECT * 
     FROM dbo.MyFunction(@Year) 

    SET @Year = @Year -1 
END 

SELECT * FROM #TOP 
DROP TABLE #TOP 

回答

0

首先,可以簡化您的查詢:

SELECT row_number() over (order by avg(Score)) as position, 
      Employee, AVG(Score) as FinalScore 
    FROM dbo.Answers 
    WHERE DATEPART(year, EvaluationDate) = @Year 
    GROUP BY Employee; 

然後,如果你想這所有年份中,使用partition by

SELECT row_number() over (partition by year(EvaluationDate) order by avg(Score)) as position, 
      Employee, AVG(Score) as FinalScore 
    FROM dbo.Answers 
    GROUP BY Employee, year(EvaluationDate); 
+0

嗯,我沒看之前在'partition by'子句中,但它不適用於我的情況,評估的實際日期不是按年份,我爲了簡化查詢而忽略它,每年有兩名員工評估,一個是在7月完成的,但是第二次在1月完成第二年即將來臨。 因此,即2015年我有一個評估在2015年7月和第二次是2016年1月 – abichango

+0

功能的簡化查詢確實有幫助,謝謝! – abichango