Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 server 计算SQL Server中每行的平均值_Sql Server_Tsql - Fatal编程技术网

Sql server 计算SQL Server中每行的平均值

Sql server 计算SQL Server中每行的平均值,sql-server,tsql,Sql Server,Tsql,我需要计算每行从一年的第一个记录开始的平均每天。 我可以通过在while循环中进行迭代来实现,但我确信我可以更简单地实现这一点。我需要一个查询来计算Amount字段附近的avgAmount 平均值的计算方法很简单,就是将金额相加,然后除以每行的最小日期和最大日期之差 create table a ( date datetime, dept varchar(50), amount float ) insert into a values ('2016-02-07', 'abc', 25) in

我需要计算每行从一年的第一个记录开始的平均每天。 我可以通过在while循环中进行迭代来实现,但我确信我可以更简单地实现这一点。我需要一个查询来计算Amount字段附近的avgAmount

平均值的计算方法很简单,就是将金额相加,然后除以每行的最小日期和最大日期之差

create table a
(
date  datetime,
dept varchar(50),
amount float
)

insert into a values ('2016-02-07', 'abc', 25)
insert into a values ('2016-02-27', 'abc', 20)
insert into a values ('2016-03-09', 'abc', 30)
insert into a values ('2016-03-28', 'abc', 45)
insert into a values ('2016-04-07', 'abc', 40)
insert into a values ('2016-04-30', 'abc', 50)
insert into a values ('2016-05-07', 'abc', 60)
insert into a values ('2016-05-27', 'abc', 50)
insert into a values ('2016-06-30', 'abc', 38)
insert into a values ('2016-07-17', 'abc', 45)
insert into a values ('2016-07-30', 'abc', 55)
insert into a values ('2016-08-07', 'abc', 70)

有什么帮助吗?

试试这个:

with FirstCalc as
(
select dept, min(date) as MinDate, max(date) as MaxDate, sum(amount) as TotalAmount
from a
group by dept
)
select dept, TotalAmount/datediff(dd, MinDate, MaxDate) as AvePerDay
from FirstCalc
试试这个:

with FirstCalc as
(
select dept, min(date) as MinDate, max(date) as MaxDate, sum(amount) as TotalAmount
from a
group by dept
)
select dept, TotalAmount/datediff(dd, MinDate, MaxDate) as AvePerDay
from FirstCalc
一种方法是:

SELECT date, amount,
AVG(amount) OVER(ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT
ROW) AS AvAmount
FROM a
ORDER BY date
一种方法是:

SELECT date, amount,
AVG(amount) OVER(ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT
ROW) AS AvAmount
FROM a
ORDER BY date

如果是SQL Server:

Select Sum(a.amount) / datediff(day, start.Date, end.Date)
From a 
  join a start 
    on start.Date = (Select Min(Date) from a
                     Where Year(date) = @Year
                        and dept = a.Dept)
  join a end 
    on end.Date =  (Select Max(Date) from a
                     Where Year(date) = @Year
                        and dept = a.Dept)
Where Year(a.Date) = @year
如果是SQL Server:

Select Sum(a.amount) / datediff(day, start.Date, end.Date)
From a 
  join a start 
    on start.Date = (Select Min(Date) from a
                     Where Year(date) = @Year
                        and dept = a.Dept)
  join a end 
    on end.Date =  (Select Max(Date) from a
                     Where Year(date) = @Year
                        and dept = a.Dept)
Where Year(a.Date) = @year

你的意思是,在这种情况下,金额之和除以2月7日至8月7日之间的天数?如果是的话,结果应该只包括一个部门的数据,还是每个部门的答案?这是在哪个数据库上运行的?SQL Server?MySQL?哪个?你的意思是,在这种情况下,金额的总和除以2月7日到8月7日之间的天数?如果是的话,结果应该只包括一个部门的数据,还是每个部门的答案?这是在哪个数据库上运行的?SQL Server?MySQL?哪一个?这是一个非常优雅的解决方案,但不幸的是,此数据库所在的sql server 2008中没有实现“在无界的前一行和当前行之间”。在SQLfiddle中进行了测试,结果良好。谢谢你的及时帮助!这是一个非常优雅的解决方案,但不幸的是,此数据库所在的sql server 2008中没有实现“在无界的前一行和当前行之间”。在SQLfiddle中进行了测试,结果良好。谢谢你的及时帮助!