2013-02-19 8 views
3

Я использую SQL Server 2008. У меня есть продажи для клиентов, и я хочу сравнить их с тем, что клиент купил в прошлом году, а также рассчитать рост. Все работает нормально, но как только у клиента есть отрицательный результат в течение одного месяца, он возвращает неверные данные для Target & Growth.Сумма отрицательных и положительных чисел

Customer  SalesLastYearMonth  SalesThisYearMonth  Target  Growth 
------------------------------------------------------------------------------ 
abcd   -1      15      ????  ??? 

Код:

SELECT 
    Customer, 
    CASE 
     WHEN SalesThisYearMonth IS NULL THEN (SalesLastYearMonth * -1) 
     WHEN SalesLastYearMonth IS NULL THEN SalesThisYearMonth 
     ELSE SalesThisYearMonth - SalesLastYearMonth END as Target, 
    CASE 
     WHEN SalesThisYearMonth IS NULL THEN -1 
     WHEN SalesLastYearMonth IS NULL THEN 1 
     WHEN SalesThisYearMonth = 0 then -1 
     WHEN SalesLastYearMonth = 0 then 1 
     ELSE (SalesThisYearMonth - SalesLastYearMonth)/SalesLastYearMonth END AS Growth 
+1

Можете ли вы привести пример ошибки и ожидаемого результата, который вы не получаете? –

+0

@abatishchev спасибо за хорошее редактирование! – Wilest

+0

@Ivan G Я получаю следующее: Цель: 16.000, рост: -16.000000 – Wilest

ответ

0

Предполагая, что вы хотите TARGET = 16, РОСТ = 16, то это следует сделать это:

SELECT 
    Customer, 
    CASE 
     WHEN SalesThisYearMonth IS NULL THEN (SalesLastYearMonth * -1) 
     WHEN SalesLastYearMonth IS NULL THEN SalesThisYearMonth 
     ELSE SalesThisYearMonth - SalesLastYearMonth END as Target, 
    CASE 
     WHEN SalesThisYearMonth IS NULL THEN -1 
     WHEN SalesLastYearMonth IS NULL THEN 1 
     WHEN SalesThisYearMonth = 0 then -1 
     WHEN SalesLastYearMonth = 0 then 1 
     ELSE (SalesThisYearMonth - SalesLastYearMonth)/ABS(SalesLastYearMonth) END AS Growth 

Однако, я действительно не уверен РОСТА там - не уверен, почему вы делите SalesLastYearMonth. В случае выше это работает, но если SalesLastYearMonth равно -4, делится на 4, что вы хотите?

0

Вы деля на отрицательное число:

SalesLastYearMonth = -1 

Вам нужно либо проверять его или вернуть абсолютное значение.

0

Просто небольшое предложение. попробуйте использовать функцию ISNULL(). если выбранное значение равно NULL, вы можете указать возвращаемое значение по умолчанию. Насколько я знаю, это намного быстрее, чем CASE WHEN.

+0

** '1' ** Для этого потребовались бы вложенные вызовы' ISNULL', которые были бы менее понятны, чем 'CASE'. ** '2' ** У вас есть * данные * для поддержки« более быстрого »утверждения? – michaelb958