Условная сумма в SQL Server - PullRequest
6 голосов
/ 21 июля 2011

У меня есть эта таблица в MSSQL:

ID   OP1   OP2  OP3
330   0     0    1
331   1     0    0
332   3     2    0

OP являются опциями.Там может быть от 1 до 9, 0 означает, что вопрос не был ответом.

Как я могу "суммировать" в столбце под названием "Ответ", например:

ID   OP1   OP2  OP3  T
330   0     0    1   1
331   1     0    0   1
332   3     2    0   2

Значениеболее 0 означает ответ.

Я пытаюсь использовать CASE WHEN, IF заявления.

Ответы [ 5 ]

7 голосов
/ 21 июля 2011

Использование CASE:

SELECT Id, OP1, OP2, OP3, 
       (CASE WHEN OP1 > 0 THEN 1 ELSE 0 END +
        CASE WHEN OP2 > 0 THEN 1 ELSE 0 END +
        CASE WHEN Op3 > 0 THEN 1 ELSE 0 END) AS T
FROM MyTable
4 голосов
/ 21 июля 2011

Менее громоздкий, чем корпус. SIGN дает 1 для значения> 0

SELECT
   ID,
   OP1,OP2,OP3,
   SIGN(OP1) + SIGN(OP2) + SIGN(OP3) AS T
FROM
   OPTABLE

Edit, May 2013. На самом деле, это может быть проще с

SIGN(OP1+OP2+OP3) AS T
2 голосов
/ 21 июля 2011

Другие ответили на ваш вопрос, но в идеале вы бы не хранили свои данные таким образом.

Эта таблица была бы лучше:

id   op   value
330  1    0
330  2    0
330  3    1
331  1    1
331  2    0
331  3    0
332  1    3
332  2    2
332  3    0

Тогда вы можете получить сумму заИдентификатор с более простым запросом:

SELECT COUNT(*) AS T FROM table WHERE id = x AND VALUE > 0

Кроме того, он масштабируется лучше, если вы решите добавить дополнительные параметры, и предоставляет более простой способ запроса данных о конкретных значениях параметров.

0 голосов
/ 21 июля 2011

Попробуйте это:

SELECT ID,OP1,OP2,OP3,(OP1+OP2+OP3) AS T FROM OPTABLE
0 голосов
/ 21 июля 2011

как насчет следующего:

SELECT ID,
       OP1,
       OP2,
       OP3,
       CASE WHEN OP1 = 0 THEN 0 ELSE 1 END + 
       CASE WHEN OP2 = 0 THEN 0 ELSE 1 END +
       CASE WHEN OP3 = 0 THEN 0 ELSE 1 END AS T

РЕДАКТИРОВАТЬ:

...