SQL Server:具有日期范围标准的平均销售额

SQL Server:具有日期范围标准的平均销售额,sql,sql-server,date,average,sql-server-2016-express,Sql,Sql Server,Date,Average,Sql Server 2016 Express,我是全新的SQL Server(大约10分钟)。我有一个测试数据库,其中包含几个列(单位、日期、主ID、平均月销售额)。月平均销售额为空 背景:我从Excel文件导入数据,这些文件是从其他文件构建的,而Excel的平均销售计算时间让我发疯,因此这篇文章 我想做的是根据相关行中的日期,用过去6个月的平均单位填充Average Sales列。i、 e.如果日期为2016-06-31,我应获得2016-01-01至2016-06-31(包括2016-06-31)期间特定主ID(主ID不是我的唯一密钥-

我是全新的SQL Server(大约10分钟)。我有一个测试数据库,其中包含几个列(单位、日期、主ID、平均月销售额)。月平均销售额为空

背景:我从Excel文件导入数据,这些文件是从其他文件构建的,而Excel的平均销售计算时间让我发疯,因此这篇文章

我想做的是根据相关行中的日期,用过去6个月的平均单位填充Average Sales列。i、 e.如果日期为2016-06-31,我应获得2016-01-01至2016-06-31(包括2016-06-31)期间特定主ID(主ID不是我的唯一密钥-仅供参考)的平均单位销售额

如前所述,我是SQL新手,我使用的是SQL Server Express(在本地运行),数据表(
SALES
)大约有800万行。我不确定这样的计算是否应该使用SQL,但我想尝试一下,这样我就可以检查它是否比我当前的方法(Excel)更快

如果有人能举例说明这一点,那就太好了

多谢各位。
标记。

将某些UniqueField替换为主键列,并仅使用select first进行测试

UPDATE t SET [AVE Monthly Sales] = x.avgsum FROM table t JOIN
(SELECT someuniquefield ,
  AVG(CASE WHEN date > DATEADD(m, -6, date - DATEPART(d, date) + 1) THEN Units END) OVER (ORDER BY Date DESC) avgsum 
    FROM table  ) as x
ON x.someunqiuefield.=t.someuniquefield

我假设您希望它是动态的,而不是固定值(允许修改数据并显示正确的值)。下面的示例显示了如何在SELECT查询中执行此操作(无需修改基础数据)

测试数据(#=临时表)

质疑

输出

Master_ID   Date_Field                  Units   Sum_Units
1           2016-07-06 00:00:00.000     10      10
1           2016-08-06 00:00:00.000     20      30
1           2016-09-06 00:00:00.000     30      60
1           2016-10-06 00:00:00.000     40      90
1           2016-11-06 00:00:00.000     50      120
1           2016-12-06 00:00:00.000     60      150
2           2016-10-06 00:00:00.000     70      70
2           2016-11-06 00:00:00.000     80      150
2           2016-12-06 00:00:00.000     90      240
这里的逻辑是,您将返回到日期范围为-3个月(本例中)的同一个表,以给出您的跑步总数


这样做比试图将数据持久化到计算列(这是我的另一种方法)更容易,因为在提取数据时只需运行一次。每次您将任何数据放入此表时,计算列都必须进行计算。

您正在运行哪个版本的Express(2008、2012、2014等)?Hi Rich,我使用的是2016,您是否需要将此数据保留在表中,还是仅在提取数据时才需要此新列(以便您可以在查询中进行计算)我想把这个放在桌子上。(编辑)你有一个独特的专栏吗?你好,里奇,谢谢你的详细回复,我将继续讨论你所做的,我会回复你的。
SELECT
     tt.Master_ID
     ,tt.Date_Field
     ,tt.Units
     ,SUM(tt2.Units) Sum_Units
FROM #TestTable tt
LEFT JOIN #TestTable tt2
    ON tt2.Date_Field BETWEEN DATEADD(m,-3,tt.Date_Field) AND tt.Date_Field
    AND tt.Master_ID = tt2.Master_ID
GROUP BY tt.Master_ID, tt.Date_Field, tt.Units
ORDER BY tt.Master_ID, tt.Date_Field
Master_ID   Date_Field                  Units   Sum_Units
1           2016-07-06 00:00:00.000     10      10
1           2016-08-06 00:00:00.000     20      30
1           2016-09-06 00:00:00.000     30      60
1           2016-10-06 00:00:00.000     40      90
1           2016-11-06 00:00:00.000     50      120
1           2016-12-06 00:00:00.000     60      150
2           2016-10-06 00:00:00.000     70      70
2           2016-11-06 00:00:00.000     80      150
2           2016-12-06 00:00:00.000     90      240