使用2个标准访问前N名的sql移动平均值
我一直在搜索论坛,在这里找到了一篇对我的问题略带微笑的帖子: 我的情况是: 我有一个表tblWEIGHT,包含:ID、日期、idPONR、重量 我还有第二个表tblSALES,其中包含:ID、日期、销售额、idPONR 我有第三个表tblPONR,其中包含:ID、PONR、idProduct 和第四个表TBL Product,包含:ID,Product 链接: tblWEIGHT.idPONR=tblPONR.ID tblSALES.idPONR=tblPONR.ID tblPONR.idProduct=tblPRODUCT.ID 我的查询的主表是tblSALES。我想列出我所有的销售额,前五名的移动平均数 重量日期小于销售日期且产品与销售产品相同的产品重量。重要的是,结果不按日期分组。我需要所有TBL销售记录 我已经得到了前1名的权重,但我无法得到移动平均线。 排名前1位的查询如下所示,我猜我需要的查询将与之非常相似使用2个标准访问前N名的sql移动平均值,sql,ms-access,Sql,Ms Access,我一直在搜索论坛,在这里找到了一篇对我的问题略带微笑的帖子: 我的情况是: 我有一个表tblWEIGHT,包含:ID、日期、idPONR、重量 我还有第二个表tblSALES,其中包含:ID、日期、销售额、idPONR 我有第三个表tblPONR,其中包含:ID、PONR、idProduct 和第四个表TBL Product,包含:ID,Product 链接: tblWEIGHT.idPONR=tblPONR.ID tblSALES.idPONR=tblPONR.ID tblPONR.idPro
SELECT tblSALES.ID, tblSALES.Dato, tblPONR.idPRODUCT,
(
SELECT top 1 Weight FROM tblWEIGHT INNER JOIN tblPONR ON tblWeight.idPONR = tblPONR.ID
WHERE tblPONR.idPRODUCT = idPRODUCT AND
SALES.Date > tblWEIGHT.Date
ORDER BY tblWEIGHT.Date desc
) AS LatestWeight
FROM tblSALES INNER JOIN VtblPONR ON tblSALES.idPONR = tblPONR.ID
这不是我确切的问题,因为我是丹麦人,我没有道理。我知道我不应该用Date作为字段名
我想filan的查询应该是这样的:
SELECT tblSALES.ID..... avg(SELECT TOP 5 weight .........)
但这样做,我不断得到错误,在最大1记录可以返回这个子查询
最后一个问题。
如果权重日期早于我销售产品的日期,我如何进行查询以创建我销售产品前5个权重的移动平均值
编辑样本数据:
日期格式:年月日
tblWEIGHT
ID Date idPONR Weight
1 01-01-2020 1 100
2 02-01-2020 2 200
3 03-01-2020 3 200
4 04-01-2020 3 400
5 05-01-2020 2 250
6 06-01-2020 1 150
7 07-01-2020 2 200
预期结果请阅读AvgWeight的评论
tblSALES.ID tblSALES.Date tblSales.Sales(amt) AvgWeigt
1 05-01-2020 30 123 -->avg(top 5 newest weight of both idPONR 1 And 2 because they are the same product, and where tblWeight.Date<05-01-2020)
2 06-01-2020 15 123 -->avg(top 5 newest weight of both idPONR 1 And 2 because they are the same product, and where tblWeight.Date<06-01-2020)
3 10-01-2020 20 123 -->avg(top 5 newest weight of idPONR 3 since thats the only idPONR with that product, and where tblWeight.Date<10-01-2020)
考虑:
问题1
SELECT tblWeight.ID AS WeightID, tblWeight.Date AS WtDate,
tblWeight.idPONR, tblPONR.PONR, tblPONR.idProduct, tblWeight.Weight, tblSales.SalesAmt,
tblSales.ID AS SalesID, tblSales.Date AS SalesDate
FROM (tblPONR INNER JOIN tblWeight ON tblPONR.ID = tblWeight.idPONR)
INNER JOIN tblSales ON tblPONR.ID = tblSales.idPONR;
问题2
SELECT * FROM Query1 WHERE WeightID IN (
SELECT TOP 5 WeightID FROM Query1 AS Dupe WHERE Dupe.idProduct = Query1.idProduct
AND Dupe.WtDate<Query1.SalesDate ORDER BY Dupe.WtDate);
问题3
SELECT Query2.SalesID, Query2.SalesDate, Query2.SalesAmt,
First(DAvg("Weight","Query2","idProduct=" & [idProduct] & " AND WtDate<#" & [SalesDate] & "#")) AS AvgWt
FROM Query2
GROUP BY Query2.SalesID, Query2.SalesDate, Query2.SalesAmt;
请提供样本数据和预期结果。这比1000个字还重要。@GordonLinoff我刚刚更新了帖子,在我看来,AvgWeight在5/1/20应该是150,在6/1/20应该是550/3,在10/1应该是300/20@mazoula这里有数据是的。但要为我的数据创建一个真实的样本需要花费很长时间。因此,对于avgWeight,您必须阅读注释。
SELECT tblWeight.ID AS WeightID, tblWeight.Date AS WtDate,
tblWeight.idPONR, tblPONR.PONR, tblPONR.idProduct, tblWeight.Weight, tblSales.SalesAmt,
tblSales.ID AS SalesID, tblSales.Date AS SalesDate
FROM (tblPONR INNER JOIN tblWeight ON tblPONR.ID = tblWeight.idPONR)
INNER JOIN tblSales ON tblPONR.ID = tblSales.idPONR;
SELECT * FROM Query1 WHERE WeightID IN (
SELECT TOP 5 WeightID FROM Query1 AS Dupe WHERE Dupe.idProduct = Query1.idProduct
AND Dupe.WtDate<Query1.SalesDate ORDER BY Dupe.WtDate);
SELECT Query2.SalesID, Query2.SalesDate, Query2.SalesAmt,
First(DAvg("Weight","Query2","idProduct=" & [idProduct] & " AND WtDate<#" & [SalesDate] & "#")) AS AvgWt
FROM Query2
GROUP BY Query2.SalesID, Query2.SalesDate, Query2.SalesAmt;