SQL - рассчитать процентное увеличение значений числового столбца - PullRequest
2 голосов
/ 17 марта 2009

Я хочу рассчитать некоторые тренды на основе значений, которые я получаю в своей базе данных SQL. В частности, я заинтересован в получении% увеличения значений в одном столбце (значение должно быть отрицательным, если значения уменьшились)

Может кто-нибудь, пожалуйста, посоветуйте, как мне это сделать?

Я не могу использовать хранимые процедуры.

Спасибо.

Моя таблица имеет следующие столбцы

Дата (числовая), Месяц (числовой), Заказы (числовые), Цена (действительная)

Я хочу рассчитать% изменения количества заказов, полученных от одного месяца к следующему. Я также хочу, чтобы направление учитывалось, т. Е. Возвращаемое значение должно быть -ve в случае снижения продаж.

Ответы [ 4 ]

3 голосов
/ 17 марта 2009

Я не уверен, разрешает ли sqllite переменные, но я так делаю в MySQL. Я только что проверил это и работал как шарм: напечатал 100% для увеличения от 10 до 20, -13,04% для уменьшения от 46 до 40.

Надеюсь, это похоже на sqllite:

SELECT
  CONCAT(
    FORMAT(
      IF(@prev AND SUM(orders) <> @prev,
          -1 * 100 * (1 - SUM(orders) / @prev),
          0
        )
      , 2)
  , '%') AS variation,
    @prev := SUM(orders) AS orders
FROM
    (SELECT @prev := NULL) init,
    product
GROUP BY
  id_product
ORDER BY
  month

Конечно, вам нужно настроить выход так, как вам нужно. Это в настоящее время форматирует прецеденты до 2 десятичных знаков и добавляет «%» в конце.

1 голос
/ 17 марта 2009

Может быть полезно, если у вас есть целочисленный столбец с годом + месяц (ГГГГММ)

cast(
     cast(year(date) as nvarchar) + 
     replicate('0',2-len(cast(month(date) as nvarchar))) +
     cast(month(date) as nvarchar)
as int)

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

select yearmonth, 
       sum(t.orders), 
       (sum(t.orders)/(select top 1 sum(orders) 
                       from table 
                       where yearmonth<t.yearmonth 
                       group by yearmonth 
                       order by yearmonth desc)-1)*100. as pct 
from table t 
group by yearmonth

Синтаксис T-SQL, надеюсь, что вы можете использовать его в sqlite

PS: чтобы избежать дальнейших проблем, необходимо выполнить проверку деления на ноль.

1 голос
/ 17 марта 2009

Не уверен насчет столбца Дата, но если в месяц есть только 1 строка, ответ может быть (у меня нет sqlite, но я думаю, что это ответ ANSI sql):

select t.date
,      t.month
,      t.orders
,      case when t2.orders = 0 then
          99999.0
       else
          100.0 * (t.orders - t2.orders) / t2.orders
       end  "increase"
from   t
left join t t2 on t2.month = t.month - 1
order by t.month
1 голос
/ 17 марта 2009

Для расчета трендов вам необходимо хранить исторические данные по интересующим вас значениям.

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