2016-09-26 2 views
1

Angenommen, ich habe eine Funktion wie dieseoder erstellen Sie gespeicherte Prozedur

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 

Dies wird eine Tabelle wie solche Rückkehr:

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

Jetzt brauche ich eine Tendenz Diagramm mit der erstellen vorherige Tabelle, plus die Informationen aus früheren Jahren.

Meine Frage ist, was die beste Praxis ist, sollte ich meine Funktion mehrmals von meiner asp.net Seite aufrufen, um mehrere Tabellen abzurufen, und behandeln Sie die Informationen auf meiner Seite.

Oder sollte ich eine gespeicherte Prozedur erstellen, die diese Funktion mehrmals ausführt und die Daten in eine temporäre Tabelle einfügt? Wie folgt aus:

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 

Antwort

0

Erstens können Sie Ihre Anfrage vereinfachen:

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; 

Dann, wenn Sie dies für alle Jahre wollen, partition by verwenden:

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

Nun, ich sah vor auf der 'partition by'-Klausel, aber es ist nicht in meinem Fall geeignet, das tatsächliche Datum der Auswertungen sein nicht nach Jahr, ich habe es weggelassen, um die Abfrage zu vereinfachen, gibt es 2 Auswertungen jährlich von Mitarbeiter, man ist getan im Juli, aber der 2. ist es am Jan getan über das nächste Jahr. Also für 2015 habe ich eine Auswertung im Juli/2015 und die 2. ist im Januar/2016 – abichango

+0

die vereinfachte Abfrage für die Funktion hat geholfen, danke! – abichango

Verwandte Themen