2012-05-02 41 views
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 

誰最初寫數據庫中的存儲NULL值在NVARCHAR格式空白或NA enter code here的人(只有上帝知道爲什麼..),所以查詢我正在玩現在使用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

腳本

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()'似乎是CPU處理的必要條件。] * – MatBailie

0

如何修復數據庫?如果數值實際爲0,是否存在NA或空白錯誤的情況?如果不是,則將所有空格和NA都轉換爲0,將列數據類型更改爲int並且不允許爲空。那麼你的生活變得更簡單了。

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