Sql server 3个月平均值未显示正确结果
我试图计算当前月份的3个月平均值,这意味着sql中的6月、7月、8月,但没有得到正确的值。不明白发生了什么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
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