我在下面有一个简单的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 :(得分: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查询,所以我建议你为这个创建存储过程,并且只需要一天调用它。 要创建过程,您可以查看microsoft documentation。
答案 1 :(得分:-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 >=@StartDate
And delivery_dt<@EndDate
Group by product_name
要返回浮动我使用:
CAST(COUNT(Qty) AS FLOAT) / @DateDifference
@DateDifference可能在您的情况下为30,但您可以根据您的具体情况更改它,而无需更改过程。与endDate相同。