2012-04-30 6 views
3

Я использую SQL Server. Формула, которую мне нужно использовать, - это (Good-Bad)/Total_Responses. Хорошее - это когда значение = = 9, а Bad - < = 6.SQL Server - использование суммы подсчета

Паспорта у меня есть:

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 

Я знаю, что придется использовать «случай, когда ISNUMERIC (Q1) = 1», чтобы убедиться, что он не использует значения NA (Они хранится как NVARCHAR)

Таким образом, формула будет в конечном итоге (5-8) /18=-0.16666 так в целом я пытаюсь получить данные выглядеть следующим образом:

DATE  Promotor_Score 
2012-03-04  -0.16666 

Спасибо!

+0

Почему NVARCHAR? Ожидаете ли вы хранить умлауты, символы фунта и иврит? –

+5

Будьте осторожны с 'ISNUMERIC' ... это не всегда делает то, что вы думаете. –

+1

Чтобы проиллюстрировать момент, сделанный @JeremyHolovacs - я написал это сообщение в 2002 году, по-прежнему актуальным сегодня: http://classicasp.aspfaq.com/general/what-is-wrong-with-isnumeric.html –

ответ

4

Это делает трюк?

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 

Или, если «NA» является единственным нечисловым значением, проверьте его явно.

+0

Я получаю этот результат: '2012-03-04 | 0' - вам нужно быть осторожным о целочисленной математике. Вы пробовали свой код? –

+0

Просто отредактирован, чтобы добавить через Q1 и Q2 ... –

+0

@Aaron - он делает целое деление, как вы говорите. Исправлена. –

0

Buildin на @DavidM ответ, я добавил преобразования поплавок и столбец Q2 осведомленности:

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

Два быстрых комментария (1) не должны ли ваши последние ISNUMERIC проверки быть против Q2? Я думаю, что в настоящее время это работает только потому, что оба столбца имеют одинаковое количество строк, которые либо проходят, либо не проверяют проверку (2). Я полагаю, что полагаться на ISNUMERIC опасно, поскольку любой старый мусор может быть введен в этот столбец. Если OP подтверждает, что «NA» является единственным возможным нечисловым значением, безопаснее проверять это значение явно, чем полагаться на ISNUMERIC. –

+0

Несомненно @AaronBertrand: (1) был ошибочным, и он исправлен; (2) если не следует учитывать только значения «NA», что делать с другими (мусорными) значениями? Я не рекомендую сохранять числовые данные на 'VARCHAR' вообще, но это было частью проблемы @Brad. –

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