2017-02-03 20 views
1

私たちの機器テーブルの月別の平均カウントを、Active、Scrapped、Newでステータスを分解して示すデータセットを作成します。SQL Serverで毎月実行中の平均を計算する

これを熟考すればするほど、これを達成する唯一の方法は、最初にコンテナのテンポラリテーブルを作成し、カーソルを使用して各レコードを評価することです。

これを一時テーブルなしで行うことはできますか?

次は、ちょうど我々が取り組んでいる分野を示しています。私はあなたのデータについてのいくつかの飾りを作ってるんだが、アイデアは月によって、単純なカウントを超える金額を平均化することである

SELECT a1.statusdate, a1.CreateDate, 
RunningTotalActive = count([status]='Active'), 
RunningTotalScrapped = count([status]='Scrapped'), 
NewEquipment = count(Month(a1.CreateDate)) 
FROM dbo.Equipment AS a1 
INNER JOIN dbo.Equipment AS a2 
ON a2.statusdate <= a1.CreateDate 
GROUP BY a1.statusdate 
ORDER BY a1.statusdate desc 
+2

サンプルデータであり、この種の質問には期待される結果が役立ちます。 – pmbAustin

+0

どのバージョンのSQL Serverですか? –

+0

@John MS SS 2012 - ありがとう – jonno

答えて

0

を。 CTEを使用します。

; WITH A AS (
    SELECT a1.statusdate, 
    Active = CASE a1.[status] WHEN 'Active' THEN 1 ELSE 0 END, 
    Scrapped = CASE a1.[status] WHEN 'Scrapped' THEN 1 ELSE 0 END, 
    New = CASE WHEN a2.statusdate = a1.CreateDate THEN 1 ELSE 0 END --Guessing here that "new" means status date and create date are the same 
    FROM dbo.Equipment AS a1 
    INNER JOIN dbo.Equipment AS a2 
    ON a2.statusdate <= a1.CreateDate --"status" can be older than "create" for a piece of equipment? Not sure I understand this criteria. May need sample data. 
), B AS (
    SELECT Y = DATEPART(YEAR, statusdate) 
    , M = DATEPART(MONTH, statusdate) 
    , SumActive = SUM(Active) 
    , SumScrapped = SUM(Scrapped) 
    , SumNew = SUM(New) 
    FROM A 
    GROUP BY DATEPART(YEAR, statusdate), DATEPART(MONTH, statusdate) 
) 
SELECT Y, M, 
    RunningTotalActive = AVG(SumActive)OVER(PARTITION BY Y,M ORDER BY Y,M), 
    RunningTotalScrapped = AVG(SumScrapped)OVER(PARTITION BY Y,M ORDER BY Y,M), 
    NewEquipment = AVG(SumNew)OVER(PARTITION BY Y,M ORDER BY Y,M) 
FROM B; 
0

いくつかのサンプルデータを表示できますか? 私の理解に基づいてスクリプトを修正しました。あなたはそれを試すことができますか?

SELECT YEAR(a1.statusdate) AS yr,MONTH(a1.statusdate) AS mon, 
      RunningTotalActive = count(CASE WHEN a1.[status]='Active' THEN 1 ELSE NULL END), -- or SUM(CASE WHEN [status]='Active' THEN 1 ELSE 0 END), 
      RunningTotalScrapped = count(CASE WHEN a1.[status]='Scrapped' THEN 1 ELSE NULL END), 
      NewEquipment = count(CASE WHEN YEAR(a1.CreateDate)*12+ MONTH(a1.CreateDate)= YEAR(a1.statusdate)*12+ MONTH(a1.statusdate)) THEN 1 ELSE NULL END) 
    FROM dbo.Equipment AS a1 
    GROUP BY YEAR(a1.statusdate),MONTH(a1.statusdate) 
    ORDER BY YEAR(a1.statusdate),MONTH(a1.statusdate) DESC 
関連する問題