2012-05-02 3 views
1

Я использую SQL Server 2000. Я пытаюсь вычислить Net Promoter Score или NPS на основе приведенной ниже формулеКак рассчитать значения для трех столбцов для данной формулы?

Формула: (Promoters - Detractors)/Total Questions

  • Scores 9 - 10 считаются промоутеров ,
  • Оценки 0 - 6 считаются недоброжелателями.
  • Оценки 7 - 8 считаются нейтральными.

У меня есть следующие данные:

Time   Q1  Q2  Q3 
----------- ------ ------ ------ 
2012-03-14  7  7  5 
2012-03-15  3  2  5 
2012-03-15  7  NA  2 
2012-03-15  9  10  NULL 
2012-03-15  8  4  4 
2012-03-15  NA  6  4 
2012-03-16  1  7  4 
2012-03-16  NULL  0  5 
2012-03-17  9  9  2 
2012-03-19  0  0  1 
2012-03-19  8  5  4 
2012-03-19  1  0  3 

Человек, который первоначально написал базу данных хранятся NULL значения в качестве заготовок или NA enter code here в формате NVARCHAR (только бог знает почему ..) так, чтобы запрос, с которым я играю, теперь использует ISNUMERIC и im пытается не подсчитывать пустые значения или значения NA.

Мой запрос, который не работает должным образом выглядит следующим образом:

SELECT CAST(SUM(CASE WHEN ISNUMERIC([Q1]) != 1 THEN 0 
      WHEN CAST([Q1] AS int) >= 9 THEN 1 
      WHEN CAST([Q1] AS int) <= 6 THEN -1 
      ELSE 0 END) 
    + SUM(CASE WHEN ISNUMERIC([Q2]) != 1 THEN 0 
      WHEN CAST([Q2] AS int) >= 9 THEN 1 
      WHEN CAST([Q2] AS int) <= 6 THEN -1 
      ELSE 0 END) 
    + SUM(CASE WHEN ISNUMERIC([Q3]) != 1 THEN 0 
      WHEN CAST([Q3] AS int) >= 9 THEN 1 
      WHEN CAST([Q3] AS int) <= 6 THEN -1 
      ELSE 0 END) 
    AS FLOAT) 
    /(SUM(CASE WHEN ISNUMERIC([Q1]) != 1 THEN 0 
       ELSE 1 END) 
    + SUM(CASE WHEN ISNUMERIC([Q2]) != 1 THEN 0 
       ELSE 1 END) 
    + SUM(CASE WHEN ISNUMERIC([Q3]) != 1 THEN 0 
       ELSE 1 END) 
    ) as [NPS] 
FROM [nps] 

Может кто-то мне точку в правильном направлении? Спасибо!

ответ

2

Как указывали другие, изменение типа данных столбца с NVARCHAR до INT было бы идеальным.

Вот запрос, который может помочь вам получить нужный результат.

Click here to view the demo in SQL Fiddle using SQL Server 2012

Script:

SELECT 
     (
      SUM (CASE WHEN q >= 9 THEN 1. END) - 
      SUM (CASE WHEN q <= 6 THEN 1. END) 
     )/
     SUM (1.) AS nps 
FROM 
(
     SELECT (CASE 
        WHEN ISNUMERIC(q1) <> 1 THEN 0. 
        ELSE CAST(q1 AS FLOAT) 
       END) AS q 
     FROM [nps] 
    UNION ALL 
     SELECT (CASE 
        WHEN ISNUMERIC(q2) <> 1 THEN 0. 
        ELSE CAST(q2 AS FLOAT) 
       END) AS q 
     FROM [nps] 
    UNION ALL 
     SELECT (CASE 
        WHEN ISNUMERIC(q3) <> 1 THEN 0. 
        ELSE CAST(q3 AS FLOAT) 
       END) AS q 
     FROM [nps] 
) nps; 

Выход:

np 
--------- 
-0.611111 
+0

@Brad - В этом ответе, если в поле есть '' NA'' или 'NULL', оно считается как' 0'. означает, что он считается хулителем. По описанию вопросов ... 36 полей, 4 являются «NA» или «NULL», и их следует игнорировать => 4 промоутера, 22 хулигана, 6 нейтральных, 32 всего => (4-22)/32 => -0.5625, а не -0.6111, как в этом ответе. * [Это может быть исправлено с 'WHERE qn <> 'NA'' в трех подзапросах. Но общая обработка' <> «NA» плюс «ISNUMERIC()» плюс «CAST()», похоже, больше процессорной обработки, чем это необходимо.] * – MatBailie

0

Как насчет исправления базы данных? Есть ли случай, когда NA или пробел неверно представлены, если значение фактически равно 0? Если нет, преобразуйте все пробелы и NA в 0, измените тип столбца на int и не допустите null. Тогда ваша жизнь станет намного проще.

+0

Администратор базы данных не позволит мне изменить базу данных ..NA или пустые значения означает, что на вопрос не был дан ответ. Поэтому преобразование их в 0 значений не будет работать. Я бы хотел, чтобы жизнь была проще. – Brad

+0

Я чувствую вашу боль, был разработчиком BI в этой ситуации много раз :( –

0

Не связывайтесь с CASTing своими типами данных. Либо измените схему, либо обработайте ее изначально.

SELECT 
    SUM(
    CASE WHEN [Q1] IN (  '9', '10') THEN 1.0 
     WHEN [Q1] IN ('7', '8', 'NA') THEN 0.0 
     WHEN [Q1] IS NULL    THEN 0.0 
             ELSE -1.0 END 
    + CASE WHEN [Q2] IN (  '9', '10') THEN 1.0 
     WHEN [Q2] IN ('7', '8', 'NA') THEN 0.0 
     WHEN [Q2] IS NULL    THEN 0.0 
             ELSE -1.0 END 
    + CASE WHEN [Q3] IN (  '9', '10') THEN 1.0 
     WHEN [Q3] IN ('7', '8', 'NA') THEN 0.0 
     WHEN [Q3] IS NULL    THEN 0.0 
             ELSE -1.0 END 
) 
/
    SUM(
    CASE WHEN [Q1] <> 'NA' THEN 1.0 ELSE 0.0 END 
    + CASE WHEN [Q2] <> 'NA' THEN 1.0 ELSE 0.0 END 
    + CASE WHEN [Q3] <> 'NA' THEN 1.0 ELSE 0.0 END 
)              AS [nps] 
FROM 
    [nps] 

Разделитель хороший, простой; если значение [Qn] равно NULL, он не прошел тест и возвращает 0.0 :)

Вы также можете упростить его, даже не меняя схему, всегда используя NULL вместо 'NA'.

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