2013-09-10 4 views
5

У меня есть два месяца с двумя значениями, например:Рассчитать процент Разница в SQL Server

July-2013 1838.08 
Aug-2013 3500.08 

Как я могу вычислить процентную разницу в августе по сравнению с июлем?

+2

Вы действительно хотите статистический * Разница * двух чисел? Или вы имеете в виду что-то еще? – RBarryYoung

+0

Я хотел бы рассчитать процент, который увеличивался/уменьшался по сравнению с предыдущим месяцем – rgx71

+1

А, это называется «* процентная разница *». «Разница» - это совсем другое дело. – RBarryYoung

ответ

16

Формула для этого легко это (Curr-Prev)*100.0/Prev, что не ясно, как применить его, так как мы не знаем, ваше определение таблицы, содержание или ключи , и, следовательно, не знают, как в целом выбрать один месяц, и это предыдущее значение. Но, жесткое кодирование было бы так:

SELECT 
    100.0*(curr.Val - prev.Val)/prev.Val As PercentDiff 
FROM yourTable As curr 
JOIN yourTable As prev 
    ON curr.MonthStr = 'Aug-2013' AND prev.MonthStr = 'July-2013' 
+0

безупречное спасибо! – rgx71

0
SELECT VAR(Bonus) 'Variance', 
STDEVP(Bonus) 'Standard Deviation', 
STDEV(Bonus) 'Standard Deviation', 
VARP(Bonus) 'Variance for the Population' 
FROM Sales.SalesPerson; 

кредитованием fololwing пост

http://blog.sqlauthority.com/2008/01/20/sql-server-introduction-to-statistical-functions-var-stdevp-stdev-varp/

+2

Примечание: разъяснение изменило вопрос. – RBarryYoung

+0

@RBarryYoung .. вы правы, но что мы можем сделать .. i upvoted your comment – Dhaval

0

Проблемы с разработкой процентных изменений является то, что вам нужно быть осторожными, когда «старое значение» 0 или вы получите сообщение об ошибке.

В одном подходе используется nullif (old_Value, 0), но тогда проблема в том, что когда старые значения равны 0, вы запрашиваете New_Value/NULL, которое является новым значением. (Безусловно, не изменение в%)

Я работал вокруг него, как это:

(case 
      when 
       OldValue = 0 and NewValue = 0 
      then 
       cast(0 as Decimal(10,2)) 
      when 
       OldValue = 0 
      then 
       'Na' 
      else 
       cast(cast(
          (
           (
            (cast(NewValue as decimal(11,3)) - 
            cast(OldValue as decimal(11,3)) 
            )*100 
           )/cast(OldValue as decimal(11,3)) 
          ) as decimal(20,3) 
         ) as varchar 
        ) 

      end) '% Change' 

я, вероятно, бросил намного больше слепков, чем это необходимо, но она хорошо работает для меня. Дает Na при необходимости и 0 при необходимости.

Смежные вопросы