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

时间:2016-12-06 11:14:57

标签: 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获得该特定主ID(主ID不是我的唯一密钥 - fyi)的平均单位销售额

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

如果有人可以通过一个例子来解释这一点,那就太棒了。

谢谢。 标记

2 个答案:

答案 0 :(得分:0)

将someuniquefield替换为您的主键列,并仅使用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

答案 1 :(得分:0)

我假设您希望这是动态而不是固定值(以允许修改数据并显示正确的值)。下面的示例显示了如何在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个月(对于这个例子)来给出你的总计。

执行此操作会更容易,而不是尝试将数据保存在计算列中(这将是我的另一种方法),因为您只需在拉取数据时运行一次。每次将任何数据放入此表时,计算列都必须计算。

相关问题