2012-04-30 4 views
3

J'utilise SQL Server. La formule que je dois utiliser est (Good-Bad)/Total_Responses. Un bon est quand la valeur est> = 9 et un mauvais est < = 6.SQL Server - Utilisation de la somme du nombre

Les données dont je dispose est:

DATE  Q1 Q2 
2012-03-04 9 9 
2012-03-04 8 8 
2012-03-04 7 9 
2012-03-04 4 NA 
2012-03-04 10 10 
2012-03-04 8 3 
2012-03-04 3 4 
2012-03-04 2 6 
2012-03-04 6 8 
2012-03-04 NA 6 

Je sais que je vais devoir utiliser un « CASE QUAND ISNUMERIC (Q1) = 1 » pour vous assurer qu'il n'utilise pas les valeurs NA (Ils sont stocké sous forme Nvarchar)

Ainsi, la formule finirait par être (5-8) /18=-0.16666 Je suis en train d'ensemble pour obtenir les données pour ressembler à:

DATE  Promotor_Score 
2012-03-04  -0.16666 

Merci!

+0

Pourquoi NVARCHAR? Pensez-vous stocker les trémas, les symboles de livre et l'hébreu? –

+5

Faites attention à 'ISNUMERIC' ... il ne fait pas toujours ce que vous pensez qu'il devrait faire. –

+1

Pour illustrer le point soulevé par @JeremyHolovacs - J'ai écrit ce post en 2002, toujours d'actualité aujourd'hui: http://classicasp.aspfaq.com/general/what-is-wrong-with-isnumeric.html –

Répondre

4

Est-ce que cela fait l'affaire?

SELECT Date, 
     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)) AS float) 
     /(SUM(CASE WHEN ISNUMERIC(Q1) != 1 THEN 0 
        ELSE 1 END) 
     + SUM(CASE WHEN ISNUMERIC(Q2) != 1 THEN 0 
        ELSE 1 END)) 
FROM Questions 
GROUP BY Date 

Ou si 'NA' est la seule valeur non numérique, testez-la explicitement.

+0

J'obtiens ce résultat: '2012-03-04 | 0' - vous devez faire attention aux mathématiques en nombres entiers. Avez-vous essayé votre code? –

+0

Juste édité pour ajouter à travers Q1 et Q2 ... –

+0

@ Aaron - il fait division entière, comme vous le dites. Fixé. –

0

Buildin sur la réponse @DavidM, j'ai ajouté la conversion de flotteur et colonne Q2 conscience:

SELECT [date], 
1e0 -- a float multiplier to avoid integer value 
* SUM(0 
    -- get the positive, negative or neutral from q1 
    + 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 
    -- get the positive, negative or neutral from q2 
    + 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(0 
    -- get the number of valid questions from q1 
    + CASE WHEN ISNUMERIC(q1) != 1 THEN 0 ELSE 1 END   
    -- get the number of valid questions from q2 
    + CASE WHEN ISNUMERIC(q2) != 1 THEN 0 ELSE 1 END 
) 
FROM Questions 
GROUP BY Date; 
+0

Deux brefs commentaires (1) ne devraient pas être votre dernier contrôle ISNUMERIC contre Q2? Je pense que cela ne fonctionne actuellement que parce que les deux colonnes ont le même nombre de lignes qui passent ou échouent le contrôle (2) Je pense que se fier à ISNUMERIC est dangereux car n'importe quelle vieille poubelle peut être entrée dans cette colonne. Si l'OP confirme que «NA» est la seule valeur non numérique possible, il est plus sûr de vérifier explicitement cette valeur que de se fier à ISNUMERIC. –

+0

Sure @AaronBertrand: (1) était un type erroné et il est corrigé; (2) si seulement les valeurs 'NA' ne devraient pas être considérées, que faire avec les autres valeurs (garbage)? Je ne recommande pas d'enregistrer des données numériques sur 'VARCHAR', mais cela faisait partie du problème @Brad présenté. –