2016-10-31 18 views
-1

私は以下の単純なSQLを持っています。私は毎日の平均を計算したいと思います。しかし、私はSQLを実行する毎日のパラメータと日数を変更する必要があります。これらの繰り返しのステップを排除するより良い方法は何ですか?毎日平均SQLで

Declare start_dt as datetime 
Declare end-dt as datetime 

Set start_dt ='10/01/16' 
Set end_dt = '10/31/16 

Select 
Product_Name, 
Count(Qty) /30 --want to calculate the average last 30 days 
From temp 
Where delivery_dt >=start_dt 
And delivery_dt<end_dt 
Group by product_name 

上記のとおり、私は平均値を取得するために、日付範囲と日数のパラメータを手動で変更する必要があります。私の平均のパラメータと数値を変更する必要がない方法がSQL Serverにありますか?平均結果をfloatと表示したいと思います。

+0

RDBMSの特色は? SQLタグの上にカーソルを置くと、なぜその質問をするのかが明確になります。 –

+0

最終段落にはSQL Serverがあります。 – dfundako

+0

Googleはgetdate()またはdateaddです。 – dfundako

答えて

1

これはおそらくあなたを助けることができます。

DECLARE @Start_dt DATETIME 
DECLARE @End_dt DATETIME 

SET @Start_dt = GETDATE() 
SET @End_dt = DATEADD(DAY, 30, @Start_dt); 


SELECT Product_Name, 
     Count(Qty)/DATEDIFF(DAY,@Start_dt,@End_dt) AS [Daily Average] --want to calculate the average last 30 days 
FROM temp 
WHERE (delivery_dt >= @Start_dt) AND (delivery_dt < @End_dt) 
GROUP BY Product_Name 

しかし、あなたは、多くの場合、私はあなたがこのいずれかのストアドプロシージャを作成し、ちょうどその日にそれを呼び出すことをお勧めしますSQLクエリのこの種を使用することを述べてきました。 手順を作成するには、マイクロソフトdocumentationをご覧ください。

+0

これは機能します。ありがとう。ジョー – joe

-1

あなたは、例えば、パラメータendDateにとdateDifference、 でストアドプロシージャを作成することができます。

CREATE PROCEDURE usp_Get_Average_Quantiity(@EndDate DateTime, @DateDifference int) 
AS 
Declare @StartDate DateTime = DATEADD(Day, @DateDifference, @EndDate) 
Select 
Product_Name, 
CAST(COUNT(Qty) AS FLOAT)/@DateDifference - 
From temp 
Where delivery_dt >[email protected] 
And delivery_dt<@EndDate 
Group by product_name 

を私が使用してfloatを返すには:

CAST(COUNT(Qty) AS FLOAT)/@DateDifference 

@DateDifferenceはおそらく、あなたの場合は30になります手順を変更することなく、特定のシナリオに従って変更することができます。 endDateと同じです。

+0

これは、時間枠上での集計とは関係ありません。あなたのロジックは毎日1行になります。 – scsimon

+0

例は164日あります。キャストのない期間の平均結果はキャスト5.28で5となります。どのような方法でもコードロジックを変更せず、結果のみを変更します。 –

+0

@aNord、プロシージャを作成する権限がありません。それを回避する方法はありますか?ありがとう – joe