我是 SQL Server 的新手(大约 10 分钟)。我有一个包含几列(单位、日期、主 ID、AVE 月销售额)的测试数据库。平均每月销售额为空。
背景:我从 Excel 文件导入数据,这些文件是从其他文件构建的,平均销售计算时间是 Excel 快把我逼疯了,所以这篇文章。
我想做的是根据相关行中的日期,用过去 6 个月的平均单位数填充“平均销售额”列。即,如果日期是 2016-06-31,我应该获得从 2016-01-01 到 2016-06-31 期间(包括 2016-06-31 在内)该特定主 ID(主 ID 不是我的唯一 key - 仅供引用)的平均单位销售额.
如前所述,我是 SQL 的新手,我正在使用 SQL Server Express(在本地运行),数据表 (SALES
) 大约有 800 万行。我不确定这样的计算是否应该使用 SQL 来完成,但我想尝试一下,这样我就可以检查它是否比我当前的方法 (Excel) 更快。
如果有人能用一个例子来解释这一点就太好了。
谢谢。 马克。
最佳答案
我假设您希望它是动态的而不是固定值(以允许修改数据并显示正确的值)。下面的示例显示了我将如何在 SELECT 查询中执行此操作(不修改基础数据);
测试数据(#=临时表)
CREATE TABLE #TestTable (Units int, Date_Field datetime, Master_ID int)
INSERT INTO #TestTable (Units, Date_Field, Master_ID)
VALUES
(10,'2016-07-06',1)
,(20,'2016-08-06',1)
,(30,'2016-09-06',1)
,(40,'2016-10-06',1)
,(50,'2016-11-06',1)
,(60,'2016-12-06',1)
,(70,'2016-10-06',2)
,(80,'2016-11-06',2)
,(90,'2016-12-06',2)
查询
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
此处的逻辑是,您要重新连接到日期范围为 -3 个月(对于本示例)的同一个表,以提供您的运行总计。
与尝试将数据保存在计算列中(这是我的另一种方法)相比,这样做会更容易,因为您只需在提取数据时运行一次。每次将任何数据放入此表时,计算列都必须进行计算。
关于SQL 服务器 : average sales with Date Range Criteria,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40994015/