2016-07-05 4 views
0

Ich habe eine Master-Tabelle mit Details (Status, ID, Titel usw.) und ein Start-und Enddatum. Erfordert aktive Details für das aktuelle Jahr.Take Monatliche Daten Von der Tabelle basierend auf StartDate und endDate

Ich habe so etwas gemacht, was mir monatliche Aufzeichnungen gab, aber das Jahr nicht berücksichtigte. Und dieser Code ist zu langsam, wenn die Tabellenzeilen zunehmen. Bitte hilf mir.

DECLARE @LoopCounter INT, 
     @Max INT, 
     @MonthName NVARCHAR(100), 
     @TransStatus int, 
     @Year int 
BEGIN 
    SELECT @LoopCounter = min(id), @Max = max(Id) 
    FROM TableName 

    CREATE TABLE #Active 
    (
     Id INT IDENTITY(1,1), 
     Month varchar(30) 
    ) 

    WHILE (@LoopCounter <= @Max) 
    BEGIN 
     INSERT into #Active 
      SELECT DateName(MONTH, DATEADD(MONTH, nos.monthnos, (Select StartDate from TableName where [email protected] And Year(StartDate)[email protected])-1)) 
      FROM (SELECT 1 monthnos 
        UNION SELECT 2 
        UNION SELECT 3 
        UNION SELECT 4 
        UNION SELECT 5 
        UNION SELECT 6 
        UNION SELECT 7 
        UNION SELECT 8 
        UNION SELECT 9 
        UNION SELECT 10 
        UNION SELECT 11 
        UNION SELECT 12) nos 
      WHERE nos.monthnos <= DATEDIFF(MONTH, (Select StartDate from TableName where [email protected]), 
                (Select EndDate from TableName where [email protected])+1) 
     SET @LoopCounter = @LoopCounter + 1 
    END 
END 

SELECT COUNT(*) As ActiveCount, Month 
FROM #Active 
GROUP BY Month 
+2

Sie verwenden eine Schleife, um Daten einzufügen. Es ist kein Wunder, dass es zu langsam ist. Wenn Sie erklären können, was dieser Code tut, können wir Ihnen vielleicht helfen, einen Set-basierten Ansatz zu finden. Die Formatierung des Codes ist einfach zu viel für mich, um zu versuchen, dies zu entziffern. –

+1

Wenn Sie bei der obigen Abfrage nur Monate generieren, wie erwarten Sie, dass Ihre Abfrage Jahre in Anspruch nimmt? Ich schlage vor, Sie fügen einige Beispieldaten und erwartete Ausgabe zu Ihrer Frage hinzu. Vielleicht wird es mehr Sinn ergeben, wenn die Leute ein bisschen ein Bild von Ihrem Problem haben, erinnern Sie sich an eine Sache, wenn Sie eine While-Schleife in SQL-Server schreiben, einen Schritt zurück und denken, es gibt fast immer einen besseren Weg es zu tun. –

Antwort

1

Ihre Frage ein wenig verwirrend ist, basiert aber auf „erfordern aktive Details Monat weise für das laufende Jahr“ Ich denke, so etwas wie dies würde für Sie viel schneller sein.

SELECT COUNT(*), YEAR([Start Date]), Month([Start Date]) 
    FROM MasterTable 
    WHERE [Start Date] BETWEEN DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) AND GETDATE() 
    GROUP BY 
    YEAR([Start Date]), Month([Start Date]) 
+0

Oder einfach '... WHERE YEAR ([StartDate]) = @Year ...' – Sphinxxx

+0

Guter Anruf @ Sphinxxx – scsimon

Verwandte Themen