MYSQL Сравнение предыдущего года с тем же днем ​​недели - PullRequest
1 голос
/ 09 апреля 2020

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

Я знаю, что могу использовать DATE_ADD, чтобы получить правильную дату. Например, приведенная ниже формула даст мне желаемую дату по отношению к 1 марта 2020 года:

DATE_ADD('2020-03-01', INTERVAL -52 WEEK)

Вышеуказанное возвращает 3 марта 2019 года. Но я не знаю, как перевернуть данные следующим образом:

+-----------+---------+
|Date       | Sales   |
|-----------+---------+
|2020-03-01 | 45.00   |
|2020-03-01 | 1.23    |
|2020-03-01 | 30.00   |
|2020-03-01 | 5.75    |
|2020-03-01 | 25.63   |
|2020-02-29 | 85.85   |
|2020-02-29 | 26.23   |
|2020-02-29 | 56.85   |
|2020-02-29 | 8.96    |
|2020-02-29 | 89.48   |
.
.
.
.
|2019-03-03 | 3.50    |
|2019-03-03 | 76.89   | 
|2019-03-03 | 1003.50 |
|2019-03-03 | 1.34    |
|2019-03-02 | 6.58    |
|2019-03-02 | 90.48   | 
|2019-03-02 | 32.12   |
|2019-03-02 | 45.89   |
|2019-03-02 | 353.21  |
|2019-03-02 | 3.71    | 
|2019-03-02 | 22.22   |
|2019-03-02 | 353.65  |
.
.
.
.
+-----------+---------+

В таблицу, подобную этой:

+-----------+--------------+--------------+
|Date       | Curr Sales   | Last Yr Sales|
|-----------+--------------+--------------+
|2020-03-01 | 107.61       | 1085.23      |
+-----------+--------------+--------------+
|2020-02-29 | 267.37       | 907.86       |
+-----------+--------------+--------------+
.
.
.

Данные содержат продажи практически за каждый день года, начиная с 2015 года, а не только за 1 марта 2020 года. возвращаемая таблица будет иметь несколько строк дат

Ответы [ 3 ]

1 голос
/ 09 апреля 2020
select t1.date, t1.Sales as 'Curr Sales', t2.sales as 'Last Yr Sales'
from(
    SELECT Date, Sum(Sales) as sales
    from table1 
    group by date
) t1
left join(
    SELECT Date, Sum(Sales) as sales
    from table1 
    group by date
) t2
on DATE_SUB(t1.date, INTERVAL 52 WEEK) = t2.date
where t1.date >= '2020-01-01'
order by t1.date desc
0 голосов
/ 09 апреля 2020

При этом все даты этого года будут сравниваться с выручкой за прошлый год, сопоставленной с днем ​​недели

Я использовал следующий алгоритм: MySQL - выберите дату для соответствующего дня недели предыдущего года

SELECT
`Date`
,ROUND(SUM(`Sales`),2) SUmthisyear
,(SELECT ROUND(SUM(IF(`Date` = DATE(DATE_SUB(t1.`Date`, INTERVAL 1 YEAR)) + INTERVAL 
    IF (
        WEEKDAY(t1.`Date`) != WEEKDAY(
            DATE(DATE_SUB(t1.`Date`,INTERVAL 1 YEAR)) + INTERVAL 1 DAY
        ), 2, 1
    ) DAY,`Sales`,0) ),2)

 FROM table1) SUmpreviousyear
FROM table1 t1
WHERE YEAR(`Date`) = YEAR(NOW())
GROUP  BY `Date`
ORDER BY `Date`
CREATE TABLE table1 (
  `Date` DATE,
  `Sales` FLOAT
);

INSERT INTO table1
  (`Date`, `Sales`)
VALUES
  ('2020-03-01', '45.00'),
  ('2020-03-01', '1.23'),
  ('2020-03-01', '30.00'),
  ('2020-03-01', '5.75'),
  ('2020-03-01', '25.63'),
  ('2020-02-29', '85.85'),
  ('2020-02-29', '26.23'),
  ('2020-02-29', '56.85'),
  ('2020-02-29', '8.96'),
  ('2020-02-29', '89.48'),
  ('2019-03-03', '3.50'),
  ('2019-03-03', '76.89'),
  ('2019-03-03', '1003.50'),
  ('2019-03-03', '1.34'),
  ('2019-03-02', '6.58'),
  ('2019-03-02', '90.48'),
  ('2019-03-02', '32.12'),
  ('2019-03-02', '45.89'),
  ('2019-03-02', '353.21'),
  ('2019-03-02', '3.71'),
  ('2019-03-02', '22.22'),
  ('2019-03-02', '353.65');
✓

✓
SELECT
`Date`
,ROUND(SUM(`Sales`),2) SUmthisyear
,(SELECT ROUND(SUM(IF(`Date` = DATE(DATE_SUB(t1.`Date`, INTERVAL 1 YEAR)) + INTERVAL 
    IF (
        WEEKDAY(t1.`Date`) != WEEKDAY(
            DATE(DATE_SUB(t1.`Date`,INTERVAL 1 YEAR)) + INTERVAL 1 DAY
        ), 2, 1
    ) DAY,`Sales`,0) ),2)

 FROM table1) SUmpreviousyear
FROM table1 t1
WHERE YEAR(`Date`) = YEAR(NOW())
GROUP  BY `Date`
ORDER BY `Date`
Date       | SUmthisyear | SUmpreviousyear
:--------- | ----------: | --------------:
2020-02-29 |      267.37 |          907.86
2020-03-01 |      107.61 |         1085.23

дБ <> скрипка здесь

0 голосов
/ 09 апреля 2020

Один из вариантов - условное агрегирование:

select
    concat(date_format(current_date, '%Y'), '-', date_format(date, '%m-%d')) date,
    sum(case when date > current_date - interval 1 year then sales end) current_year_sales,
    sum(case when date <= current_date - interval 1 year then sales end) last_year_sales
from mytable
where date > current_date - interval 2 year
group by date_format(date, '%m-%d')
order by date_format(date, '%m-%d')

. Это дает ежедневные продажи за последние 365 дней вместе с соответствующими продажами в тот же день предыдущего года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...