SQL само-соединение, чтобы получить значения 3 недели назад - PullRequest
0 голосов
/ 19 мая 2019

Я не очень знаком с SQL, однако мне нужно сделать запрос для прогноза продажи.

Данные предназначены для продажи с разными идентификаторами prodID, shopID, weekDay, date и Sale.Мне нужно получить продажу одного и того же продукта в том же магазине и в тот же день недели в течение прошлых (например) 3 недель.Поэтому необходимо правильное вращение.Может случиться так, что в течение нескольких дней не будет записи о продажах для этой комбинации продукт-магазин-будний день.Также важно, что я должен игнорировать отрицательные значения продаж (если таковые имеются) для среднего расчета.

Это заголовок данных:

DATE        prodID  shopID  sale    weekDay
2017-03-01  8       16      4.8     Wednesday
2017-03-01  2       16      18.8    Wednesday
2017-03-01  62      16      1.7     Wednesday
2017-03-01  34      16      3.6     Wednesday
2017-03-01  32      16      12.0    Wednesday
2017-03-02  8       16      3.6     Thursday
2017-03-02  34      16      15.8    Thursday

Идеальный результат:

DATE  prodID    shopID   sale  weekDay   saleWeek-1 saleWeek-2 saleWeek-3 ave_3sale

Возможно, для построения новых столбцов можно использовать самосоединение.Большое спасибо за вашу помощь.

1 Ответ

1 голос
/ 19 мая 2019

Я сделал вам пример sqlfiddle, чтобы показать вам, как вы можете сделать свое заявление sql http://www.sqlfiddle.com/#!9/1877b3/4/0 Вы, конечно же, указали имя таблицы и имена столбцов. В этом примере будут показаны продажи каждого дня плюс то, что вы продали за этот продукт для этого salesID на прошлой неделе и за 2 недели до этого.

CREATE TABLE salestable (
 id MEDIUMINT NOT NULL  AUTO_INCREMENT,
datelit Date NOT NULL,
  productID int(10) NOT NULL,
  saleID int(10) NOT NULL,
 sale float(4,2) NOT NULL,
   weekday CHAR(30) NOT NULL,
 PRIMARY KEY (id)
) DEFAULT CHARSET=utf8;
INSERT INTO `salestable` (`id`,`datelit`, `productID`, `saleID`,`sale`,`weekday`) VALUES
(NULL,'2019-05-18',  8,       16,      4.8,     'Wednesday'),
(NULL,'2019-05-18', 2,       16,      18.8,     'Wednesday'),
(NULL,'2019-05-18', 62,       16,      1.7,     'Wednesday'),
(NULL,'2019-05-18',  34,       16,      3.6,     'Wednesday'),
(NULL,'2019-05-17',  32,       16,      12.0,     'Wednesday'),
(NULL,'2019-05-18',  8,       16,      3.6,     'Wednesday'),
(NULL,'2019-05-18',  34,       16,      15.8,     'Wednesday');
SELECT a.datelit,a.productID, a.saleID, a.sale,a.weekday, b.salesumweek1, c.salesumweek2
FROM `salestable` a
Left JOIN (
SELECT saleID,productID, SUM(sale) as salesumweek1 
FROM `salestable`

  Where datelit BETWEEN  DATE_ADD(CURDATE(), INTERVAL -7 DAY) AND CURDATE()
  GROUP BY saleID,productID
) b ON a.saleID = b.saleID AND a.productID = b.productID
Left JOIN (
SELECT saleID,productID, SUM(sale) as salesumweek2 
FROM `salestable`
Where datelit BETWEEN  DATE_ADD(CURDATE(), INTERVAL -7 DAY) AND DATE_ADD(CURDATE(), INTERVAL -14 DAY)
  GROUP BY saleID,productID
) c ON a.saleID = c.saleID AND a.productID = c.productID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...