Sql server 3个月平均值未显示正确结果

Sql server 3个月平均值未显示正确结果,sql-server,Sql Server,我试图计算当前月份的3个月平均值,这意味着sql中的6月、7月、8月,但没有得到正确的值。不明白发生了什么 EMAIL ORDERDATE PRICE xyz@gmail.com 7/30/2019 55.42 xyz@gmail.com 7/27/2019 66.06 xyz@gmail.com 5/7/2019 56.48 abc@yahoo.com 8/2/2019 66.99 abc@yahoo.com 8/1/2019

我试图计算当前月份的3个月平均值,这意味着sql中的6月、7月、8月,但没有得到正确的值。不明白发生了什么

EMAIL           ORDERDATE   PRICE
xyz@gmail.com   7/30/2019   55.42
xyz@gmail.com   7/27/2019   66.06
xyz@gmail.com   5/7/2019    56.48
abc@yahoo.com   8/2/2019    66.99
abc@yahoo.com   8/1/2019    200.87
abc@yahoo.com   7/25/2019   112.22
abc@yahoo.com   6/24/2019   323.65
abc@yahoo.com   5/7/2019    55.6
这是ouput的计算方式:它不是总和。对于第一个电子邮件地址,我们只有7月份的销售历史记录,而在6月或8月没有。因此它是55.42+66.06/1,然后我们有6月、7月、8月的销售历史记录66.99+200.87+112.22+323.65/3。因为它是3个月的平均值。希望这能让事情变得更清楚

 output required:
    email                  avg
    xyz@gmail.com        121.48
    abc@yahoo.com        234.57
我使用的代码:

    select 
    mo.Email,
    aVG(case when mo.OrderDate >= DATEADD(MONTH, -3, GETDATE())  then 
   (mo.Price) END )AS 'Average_3Months'
    from Order mo
    group by
    mo.Email

你能试着先求和,然后除以下面的计数吗

;with cte as (
    select 
    mo.Email,
    sum(case when mo.OrderDate >= DATEADD(MONTH, -3, GETDATE()) then 
    (mo.Price) else 0 END ) AS 'Sum_3Months',
    sum(case when mo.OrderDate >= DATEADD(MONTH, -3, GETDATE()) then 
    1 else 0 END ) AS 'Sum_3Months_Count'
    from Order mo
    group bymo.Email
)
select Email, Sum_3Months/Sum_3Months_Count as Avg_3months
from cte
where Sum_3Months_Count>0
group by Email

这不是计算平均值的常用方法,当然不能用平均值:

select 
  mo.Email,
  sum(case when mo.OrderDate >= DATEADD(MONTH, -3, GETDATE()) then mo.Price END) / 
  count(distinct case when mo.OrderDate >= DATEADD(MONTH, -3, GETDATE()) then month(mo.orderdate) END)
  as 'Average_3Months'
from [order] mo
group by mo.Email
或更简单:

select 
  mo.Email,
  sum(mo.Price) / count(distinct month(mo.orderdate)) as 'Average_3Months'
from [order] mo
where mo.OrderDate >= DATEADD(MONTH, -3, GETDATE())
group by mo.Email

结果:

> Email         |  Average_3Months
> :------------ | ---------------:
> abc@yahoo.com | 234.576666666667
> xyz@gmail.com |           121.48

您可以将下面的脚本与子查询一起使用。OrthDead的条件将从第三个月前的1天一直到今天。这里OrderDate正在检查>='2019-June-01',它是从今天的GETDATE自动计算出来的

SELECT A.EMAIL,AVG(A.monthly_total) Average_of_Month 
FROM
(
    SELECT MONTH(OrderDate) MN, mo.Email,
    SUM(price ) monthly_total
    FROM your_table mo
    WHERE OrderDate >= CAST(DATEADD(MM,-2,DATEADD(DD,-(DATEPART(Day,GETDATE()))+1,GETDATE())) AS DATE)
    GROUP BY MONTH(OrderDate),mo.Email
)A
GROUP BY A.EMAI

嗯,您可能引用了不同的列。在查询中,您输入mo.OrderDateTime,但输出显示ORDERDATE。mo的情况也是一样。总价vs价格。可能是错误的表??你说你想要一个平均值,但你需要的输出是一个总和。@Eric修复了查询以显示正确的表。你得到了什么输出?你显示的预期输出不是电子邮件的平均值。。。对于xyz电子邮件,这将是55.42+66.06/2=60.74。。。121.48是总数
SELECT A.EMAIL,AVG(A.monthly_total) Average_of_Month 
FROM
(
    SELECT MONTH(OrderDate) MN, mo.Email,
    SUM(price ) monthly_total
    FROM your_table mo
    WHERE OrderDate >= CAST(DATEADD(MM,-2,DATEADD(DD,-(DATEPART(Day,GETDATE()))+1,GETDATE())) AS DATE)
    GROUP BY MONTH(OrderDate),mo.Email
)A
GROUP BY A.EMAI