SQL 服务器 : average sales with Date Range Criteria

标签 sql sql-server date average sql-server-2016-express

我是 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/

相关文章:

sql - System.Data.dll 中发生了类型 'System.IndexOutOfRangeException' 的第一次机会异常

.net - SQL Server 和 .NET 类型化数据集 AllowDBNull 元数据

C# WPF 从 SQL Server 数据库中检索图像,字节到图像

sql-server - 必须声明标量变量 "@??????"

php - 在 PHP 中将日期添加到日期(从 MySQL 数据库中检索)

java - 简单的java日期转换

mysql - 转换后更新存储为 VARCHAR 的表中的 DATE

mysql - 需要有关在 laravel 中使用的 select 语句的帮助

sql - 分析表,优化表,多久一次?

mysql - 日期的 SQL 查询聚合