2009-03-17 5 views
2

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

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

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

Спасибо.

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

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

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

+0

«Может кто-нибудь угодить советам, как я должен это делать?» Не без какой-либо базовой информации о вашей схеме. – kquinn

ответ

3

Я не уверен, что 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

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

1

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

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

Не уверен, что о дате колонки, но если есть только одна строка в месяц, то ответ может быть (я не имею 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 
Смежные вопросы