1

我正在使用 SQL Server 2000。我正在尝试根据以下公式计算净推荐值或 NPS

公式(Promoters - Detractors) / Total Questions

  • 分数 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

最初编写数据库的人将值存储为NVARCHARNULL格式的空白或 NA (只有上帝知道为什么..)所以我正在使用的查询现在使用ISNUMERIC并且我试图不计算空白或 NA 值。enter code here

我的查询无法正常工作,如下所示:

 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]

有人可以指出我正确的方向吗?谢谢!

4

3 回答 3

2

正如其他人指出的那样,将列的数据类型从 更改NVARCHARINT将是理想的。

这是可以帮助您获得所需结果的查询。

单击此处查看使用 SQL Server 2012 在 SQL Fiddle 中的演示

脚本

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
于 2012-05-02T13:20:19.297 回答
0

修复数据库怎么样?如果值实际上为 0,是否存在错误表示 NA 或空白的情况?如果不是,则将所有空格和 NA 转换为 0,将列数据类型更改为 int 并且不允许为空。然后你的生活就变得简单多了。

于 2012-05-02T12:59:08.273 回答
0

不要乱投你的数据类型。要么更改架构,要么本地处理它们。

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'.

于 2012-05-02T13:07:40.677 回答