我是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)更快。
如果有人可以通过一个例子来解释这一点,那就太棒了。
谢谢。 标记
答案 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个月(对于这个例子)来给出你的总计。
执行此操作会更容易,而不是尝试将数据保存在计算列中(这将是我的另一种方法),因为您只需在拉取数据时运行一次。每次将任何数据放入此表时,计算列都必须计算。