2016-09-29 13 views
1

の最初から値のみで四半期平均を計算する方法のは、私は次の表があるとしましょう:SQL Server 2012の:毎月

CREATE TABLE Portfolio.DailyNAV 
(
Date date NOT NULL, 
NAV int NOT NULL, 
) 
GO 

日付列は、2015から02「から始まる毎日営業日あり-02 '、NAV列にはその日の総資産価値があります。私は四半期の平均NAVを取得したい。この例では、私は2016年の第2四半期のための私のコードを、それを取得したいのは、想定してみましょうことは今ある:

Select AVG(NAV) As AvgNAV 
FROM Portfolio.DailyNAV 
WHERE year(Date) = '2016' AND DATEPART(QUARTER,Date) = '2' 
GO 

私が直面しています問題は、このコードは、四半期の毎日の平均値を算出するが、平均NAVがすべきことですその四半期の各月の最初の営業日を使用してのみ計算されます。したがって、2016年第2四半期の平均NAVは、2016-04-01,2016-05-02(第1日は就業日ではない)および2016-06-01からの平均でなければなりません。私は単純にWHERE句を変更して、その日付を使用したくないのです。なぜなら、ユーザが年と四半期を入れて平均NAVを得ることができるストアドプロシージャを作成したいからです。

ありがとうございました。

+0

ですから、あなたQUARTER = 2句の外に落ちる日が含まれるようにしたいですか? – scsimon

+0

こんにちは、私は四半期= 2の句に含まれる日数を含めていますが、平均は、その四半期の各月の最初の営業日を使用して計算する必要があります – MilesToGoBeforeISleep

答えて

3

これは動作するはずです:

WITH CTE AS 
(
    SELECT *, 
      RN = ROW_NUMBER() OVER(PARTITION BY CONVERT(VARCHAR(6),[Date],112) 
            ORDER BY [Date]) 
    FROM Portfolio.DailyNAV 
    WHERE YEAR([Date]) = 2016 
    AND DATEPART(QUARTER,[Date]) = 2 
    AND NAV IS NOT NULL 
) 
SELECT AVG(NAV) AvgNAV 
FROM CTE 
WHERE RN = 1; 
+0

こんにちは、これは私のコードと同じ結果を与えるその四半期の各月の最初のレコードだけではなく、毎日の平均を取る – MilesToGoBeforeISleep

+1

@MilesToGoBeforeISleepはい、もちろん、私は条件を忘れました。私の答えは今更新されました – Lamak

+0

ありがとうございました。これは機能します。 RN、Row_Number、OVER、PARTITIONが何をしているのか説明してください。私はこれで新しく、コーディングの特定のラインは、私が前に出会ったことではありません。 – MilesToGoBeforeISleep

関連する問題