Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何计算运行平均值_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何计算运行平均值

Sql 如何计算运行平均值,sql,sql-server,tsql,Sql,Sql Server,Tsql,情景: 我想计算到目前为止整个月的销售金额移动平均数。 每个月有不同的天数。如果销售额为0,则表示此人有休息日,我需要忽略该值 样本数据: 最终移动平均值为100+200+300+100/4,因为我们忽略了4月4日,因为它的销售额为0 我在此网站上发现的内容不符合我的需要: 但是它是针对特定的天数,当每个月有不同的天数并且我想忽略某些行时,我如何应用它 预期结果: 我试着做的是: 通过删除分区 由于您对0不感兴趣,请在销售金额上使用NULLIF 此外,在行之前还有一个额外的逗号 您可以尝试使用两

情景:

我想计算到目前为止整个月的销售金额移动平均数。 每个月有不同的天数。如果销售额为0,则表示此人有休息日,我需要忽略该值

样本数据:

最终移动平均值为100+200+300+100/4,因为我们忽略了4月4日,因为它的销售额为0

我在此网站上发现的内容不符合我的需要: 但是它是针对特定的天数,当每个月有不同的天数并且我想忽略某些行时,我如何应用它

预期结果:

我试着做的是:

通过删除分区 由于您对0不感兴趣,请在销售金额上使用NULLIF 此外,在行之前还有一个额外的逗号


您可以尝试使用两个聚合窗口函数来创建它,一个用于计算逻辑,另一个用于累计销售额


行之前有语法错误,不需要按日期进行分区。但实际上并不需要这些行。这应该满足您的要求:

AVG(NULLIF(Sales_Amount, 0)) OVER (Order by [Date])

如果您有重复的日期,那么您可能需要指定一个窗口框架,但您需要解释如何处理重复的日期。

您可以使用相关查询,这样,对于小于外部查询的内部查询的所有日期,都会考虑进行平均计算

SELECT [sales_amount], [date], 
      (SELECT AVG(NULLIF(T2.sales_amount, 0)) 
       FROM your_table T2 
       WHERE T2.orderdate <= T1.orderdate
      ) AS 'moving_average'
FROM your_table T1
ORDER BY T1.date

它将考虑所有日期小于或等于当前行[DATE ]的行,并计算它们的平均值。正如@Squirrel所提到的,NULLIFT2.sales_amount 0应该跳过平均计算中的0值。

您是否尝试过此网站的基本搜索?您期望的结果是什么?仅供参考,我在这个网站上发现的不符合我的需要:sqlservercentral不是这个网站:@D-Shih有帮助吗?如果您使用DDL+DML创建一个示例数据和一个完整的查询,人们可以更容易地提供帮助。
AVG (Sales_Amount) OVER (
Partition BY [Date]
Order by [Date]
,Rows Between Unbounded Preceding and Current Row)
AVG ( NULLIF(Sales_Amount, 0) ) 
    OVER 
    (
        Order by [Date]
        Rows Between Unbounded Preceding and Current Row
    )
SELECT *,
       SUM(sales_amount) OVER(Order by [Date])/
       SUM(CASE WHEN sales_amount<>0 THEN 1 ELSE 0 END) OVER(Order by [Date]) moving_average
FROM T
AVG(NULLIF(Sales_Amount, 0)) OVER (Order by [Date])
SELECT [sales_amount], [date], 
      (SELECT AVG(NULLIF(T2.sales_amount, 0)) 
       FROM your_table T2 
       WHERE T2.orderdate <= T1.orderdate
      ) AS 'moving_average'
FROM your_table T1
ORDER BY T1.date