mysql - Расчет прибыли от продаж между датами - PullRequest
0 голосов
/ 15 мая 2018

У меня есть таблица, которая выглядит следующим образом:

+--------+---------------------+-------+--------+-----------+
| PartNo | Date                | Inv   | Retail | Wholesale |
+--------+---------------------+-------+--------+-----------+
| 1      | 2018-05-12 00:00:00 | 15    | $100   | $90       |
| 2      | 2018-05-12 00:00:00 | 20    | $200   | $150      |
| 3      | 2018-05-12 00:00:00 | 25    | $300   | $200      |
| 1      | 2018-05-13 00:00:00 | 10    | $95    | $90       |
| 2      | 2018-05-14 00:00:00 | 15    | $200   | $150      |
| 3      | 2018-05-14 00:00:00 | 20    | $300   | $200      |
+--------+---------------------+-------+--------+-----------+

И я хочу, чтобы она выглядела так с запросом Mysql:

+--------+------+--------+
| PartNo | Sold | Profit |
+--------+------+--------+
| 1      | 5    | $25    |
| 2      | 5    | $250   |
| 3      | 5    | $500   |
+--------+------+--------+

Мне нужно сгруппировать по PartNo, покавычисление разницы между итогами и прибылью в диапазоне дат.

Прибыль за единицу должна рассчитываться путем вычитания оптовой торговли из розничной торговли в последний день (или запись) диапазона дат.

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

Любая помощь могла быбудьте супер оценены.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018
SELECT c.partno as partno,MAX(c.inv)-MIN(c.inv) as sold,SUM(CASE WHEN c.date = c.last_date THEN profit else 0 END)*(MAX(c.inv)-MIN(c.inv)) as profit
FROM (SELECT partno,date,inv,retail-wholesale as profit,MAX(date) OVER (partition by partno) AS last_date FROM test1)c
GROUP BY c.partno
ORDER BY c.partno;

Используя оконную функцию , сначала добавьте новый столбец, чтобы отследить максимальную дату для каждой партии. Таким образом, внутренний запрос внутри FROM будет производить строки, подобные этим, с одним столбцом, добавленным к исходному набору данных,

| 1      | 2018-05-12 00:00:00 | 15    | $100   | $90       | **2018-05-13 00:00:00** |

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

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

PS: логика для проданных товаров - группировка по частям и вычитание MIN (Inv) из MAX (Inv)

Ссылка на SQL Fiddle

0 голосов
/ 15 мая 2018

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

Например, для периода, начинающегося 2018-05-13 и заканчивающегося 2018-05-14:

select  parts.PartNo
,       coalesce(FirstSale.Total, 0) - coalesce(LastSale.Total, FirstSale.Total, 0) as Sold
,       (coalesce(FirstSale.Total, 0) - coalesce(LastSale.Total, FirstSale.Total, 0)) *
           coalesce(LastSale.Retail - LastSale.Wholesale, 0) as Profit
from    (
        select  PartNo
        ,       max(case when Date < '2018-05-13' then Date end) as FirstEntry
        ,       max(case when Date <= '2018-05-14' then Date end) as LastEntry
        from    Sales
        group by
                PartNo
        ) parts
left join    
        Sales FirstSale
on      FirstSale.PartNo = parts.PartNo
        and FirstSale.Date = parts.FirstEntry
left join    
        Sales LastSale
on      LastSale.PartNo = parts.PartNo
        and LastSale.Date = parts.LastEntry

Пример на скрипте SQL.

...