1

SQLServer2000を使用しています。次の式に基づいてネットプロモータースコアまたは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

データベースに最初にデータベースを書き込んだ人は、値をNVARCHAR形式でNULL空白または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 Server2012を使用したSQLFiddleのデモを表示するには、ここをクリックしてください

スクリプト

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に変更して、nullを許可しないようにします。そうすれば、あなたの人生はずっとシンプルになります。

于 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 に答える