Увеличение объема продаж - PullRequest
       6

Увеличение объема продаж

0 голосов
/ 21 сентября 2018

У меня есть таблица типа Bikes

name    mfgdate                qtysold 

bajaj   1/1/2016 12:00:00 AM    48
bajaj   1/1/2017 12:00:00 AM    49
bajaj   1/1/2018 12:00:00 AM    50
pulsar  1/1/2016 12:00:00 AM    300
pulsar  1/1/2017 12:00:00 AM    250
pulsar  1/1/2018 12:00:00 AM    200
yamaha  1/1/2016 12:00:00 AM    90
yamaha  1/1/2017 12:00:00 AM    180
yamaha  1/1/2018 12:00:00 AM    100

Из приведенной выше таблицы мне нужно выбрать запрос, чтобы получить результат увеличения продаж, например

например: output

 name
 Bajaj

, потому что Bajaj имеет увеличенные продажи.Yamaha также увеличила продажи, но в 2018 году она сократилась.

Заранее спасибо ..

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

MySQL Self Join:

SELECT
  *
FROM
  Bikes      AS this_year
LEFT JOIN
  Bikes      AS prev_year
    ON  prev_year.name    = this_year.name
    AND prev_year.mfgdate = DATE_SUB(this_year.mfgdate, INTERVAL 1 YEAR)
GROUP BY
  this_year.name
HAVING
  MIN(this_year.qtysold - COALESCE(prev_year.qtysold, 0)) > 0

MariaDB LAG ():

WITH
  historicised AS
(
  SELECT
    *,
    LAG(qtysold) OVER (PARTITION BY name
                           ORDER BY mfgdate
                      )
                        AS prev_qtysold
  FROM
    Bikes
)
SELECT
  name
FROM
  historicised
GROUP BY
  name
HAVING
  MIN(qtysold - COALESCE(prev_qtysold, 0)) > 0
0 голосов
/ 21 сентября 2018

Основываясь на комментариях OP , необходимо найти только те имена Bike, в которых продажи никогда не снижались.

  • Следующее решение будет работать на ВсеВерсии MySQL (особенно <8.0) </strong>
  • Используя коррелированный подзапрос , мы находим предыдущее значение qtysold для велосипеда.Если не найден, используя Ifnull () , считайте его равным нулю
  • Рассчитать изменение (qtysold - предыдущий qtysold)
  • Теперь, используя это как Производная таблица, мы можем получить все эти Distinct имена велосипедов, где изменения всегда были> 0

Вы можете попробовать следующее (отметьте SQL Fiddle ):

SELECT t3.name 
FROM 
(
SELECT t1.name, 
       (t1.qtysold - IFNULL(
                            (SELECT t2.qtysold 
                            FROM Bikes as t2 
                            WHERE t2.name = t1.name 
                              AND t2.mfgdate < t1.mfgdate 
                            ORDER BY t2.mfgdate DESC LIMIT 1)
                            , 0
                           )) AS sales_change 
FROM Bikes as t1
) AS t3 
GROUP BY t3.name 
HAVING MIN(t3.sales_change) > 0
0 голосов
/ 21 сентября 2018

Вы можете использовать SELF JOIN для получения желаемого результата.Внутренний запрос вернет имена всех Bikes, которые имеют падение продаж.Затем вы можете использовать предложение NOT IN, чтобы найти пропущенные записи результатов.

SELECT DISTINCT b.name
FROM Bikes b
WHERE
b.name NOT IN (
    SELECT DISTINCT b1.name
    FROM
    Bikes b1
    INNER JOIN
    Bikes b2
    ON b1.name = b2.name
       AND b1.mfgdate < b2.mfgdate
       AND b1.qtysold > b2.qtysold
);
0 голосов
/ 21 сентября 2018

Вы можете использовать оконную функцию:

select t.*, 
       sum(case when exists (select 1 
                             from table t1 
                             where t1.name = t.name and t1.mfgdate > t.mfgdate and t1.qtysold < t.qtysold
                            ) 
                then 1 else 0 end
          ) over (partition by name) as grp
from table t;

Теперь вы можете отфильтровать имена, которые увеличили продажи:

select t.*
from ( <subquery here> ) t
where t.grp = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...