SQL Server:具有日期范围标准的平均销售额
我是全新的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(在本地运行),数据表(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不是我的唯一密钥-
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