Доступ sql Скользящее среднее числа первых N с 2 критериями - PullRequest
0 голосов
/ 20 июня 2020

Я искал по форуму и нашел здесь одно сообщение, которое немного отражает мою проблему: Рассчитать среднее значение для Top n в сочетании с SQL Group By .

My ситуация:

  1. У меня есть таблица tblWEIGHT, которая содержит: ID, Date, idPONR, Weight
  2. У меня есть вторая таблица tblSALES, которая содержит: ID, Date, Sales, idPONR
  3. У меня есть третья таблица tblPONR, которая содержит: ID, PONR, idProduct
  4. И четвертую таблицу tblPRODUCT, которая содержит: ID, Product

Ссылка:

  1. tblWEIGHT.idPONR = tblPONR.ID
  2. tblSALES.idPONR = tblPONR.ID
  3. tblPONR.idProduct = tblPRODUCT.ID

maintable моего запроса - tblSALES. Я хочу, чтобы все мои продажи были перечислены со скользящим средним из 5 основных весов ПРОДУКТА, где дата веса меньше даты продажи, а продукт совпадает с проданным. ВАЖНО, чтобы результат не был сгруппирован по дате. Мне нужны все записи tblSALES.

Я дошел до того, чтобы получить верхний 1 вес, но я не могу получить его скользящее среднее. Запрос, который показывает первую 1, следующий, и я предполагаю, что запрос, который мне нужен, будет очень похож на него.

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 

это не мой точный запрос, так как im dani sh и я не имел бы смысла. Я знаю, что я не должен использовать Date в качестве имени поля.

Я предполагаю, что запрос filan будет примерно таким:

SELECT tblSALES.ID..... avg(SELECT TOP 5 weight .........)

, но при этом я продолжаю получать ошибку при макс.1 записи может быть возвращенный этим подзапросом

Последний вопрос. Как мне сделать запрос, который создает скользящее среднее из пяти верхних весов моего проданного продукта, если дата веса предшествует дате продажи продукта?

EDIT Sampledata: DATEFORMAT: dd / мм / гггг

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
tblSALES
ID     Date    Sales(amt)   idPONR     
1   05-01-2020     30          1
2   06-01-2020     15          2
3   10-01-2020     20          3
tblPONR
ID    PONR(production Number)    idProduct
1             2521                    1
2             1548                    1
3             5484                    2
tblPRODUCT
ID     Product
1      Bricks
2       Tiles

Желаемый результат прочтите комментарии для 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 Ответ

1 голос
/ 22 июня 2020

Рассмотрим:

Query1

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;

Query2

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);

Query3

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...