詳細(ステータス、ID、タイトルなど)と開始日と終了日を持つマスターテーブルがあります。現時点で月に有効な情報を必要とします。月次データを取得するStartDateとendDateに基づいてテーブルから
私は月の賢明な記録を与えたが、年を考慮しなかった。テーブル行が増えると、このコードが遅すぎます。私を助けてください。
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
データを挿入するためにループを使用しています。それが遅すぎるのも不思議ではありません。おそらく、もしあなたがそのコードが何をしているのかを説明することができれば、集合に基づくアプローチを見つけるのを助けることができます。コードの書式設定は、これを解読しようとするのは大変です。 –
上記のクエリで月が生成されている場合は、クエリに何年もかかると思われますか?私はいくつかのサンプルデータとあなたの質問に予想される出力を追加することをお勧めします。おそらく、人々があなたの問題の視覚的なイメージを少し持たなければ、SQL Serverでwhileループを作成しようとしているときに忘れてはならないことを思い出し、一歩踏み込んで考えてみてください。それをするの。 –