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
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. –
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. –