Сумма значений одной строки?

У меня есть запрос MySQL, который возвращает одну строку, представляющую собой серию 1 и 0. Это для индикатора прогресса. Теперь у меня есть суммирование в коде, но я попытался суммировать значения в запросе и понял, что не могу использовать SUM(), потому что это много столбцов, а всего одна строка.

Есть ли способ, которым я могу автоматически суммировать это в запросе? Это вот так:

item_1 | item_2 | item_3 | item_4
-------+--------+--------+--------
     1 |      1 |      0 |      0

Изменить: я забыл упомянуть, что item_1 и т. д. не являются простыми значениями поля, но каждое из них представляет собой скорее выражение, такое как SELECT IF( field_1 = 1 and field_2 IS NOT NULL, 0, 1 ) AS item_1 ..., поэтому похоже, что мне нужно выполнить вложенный запрос:

SELECT ( item_1 + item_2 ... ) FROM ( SELECT IF( field_1 = y and field_2 IS NOT NULL, 1, 0 ) AS item_1 ... ) AS alias

Верный?


person user151841    schedule 01.02.2010    source источник


Ответы (2)


select item_1 + item_2 + item_3 + item_4 as ItemSum
from MyTable

Если могут быть нулевые значения, вам нужно будет обрабатывать их следующим образом:

select ifnull(item_1, 0) + ifnull(item_2, 0) + ifnull(item_3, 0) + ifnull(item_4, 0) as ItemSum
from MyTable
person D'Arcy Rittich    schedule 01.02.2010
comment
Ах! Так как это выражения, а не простые значения, я мог бы выполнить вложенный запрос: SELECT (item_1 + item_2...) FROM (SELECT IF(field_1 = y and field_2 IS NOT NULL, 1, 0) AS item_1... ) Псевдоним AS. Верный? - person user151841; 01.02.2010

Вы не можете сделать это проще, чем:

SELECT item_1 + item_2 + item_3 + item_4
FROM Table1

Если у вас много столбцов, то для ввода потребуется некоторое время. Думаю, создание таблицы тоже заняло довольно много времени.

В будущем создавайте свои таблицы по-другому, чтобы каждый этап процесса представлял собой строку, а не столбец. Другими словами, вместо этого:

id, item_1, item_2, item_3, item_4

Ваша таблица может выглядеть так:

id, item_number, value

И тогда вы можете запросить его следующим образом:

SELECT SUM(value)
FROM Table1
WHERE id = @id

На самом деле вам, вероятно, даже не нужен столбец значений. Наличие или отсутствие строки является достаточной информацией. Таким образом, ваш запрос становится:

SELECT COUNT(*)
FROM Table1
WHERE id = @id

Возможно, на этот раз для вас немного поздно, но если у вас все еще есть шанс изменить дизайн, то, возможно, стоит подумать об этом.

person Mark Byers    schedule 01.02.2010
comment
Я не могу сделать таблицу с другим дизайном, который вы описываете, потому что каждый item на самом деле является логическим флагом и значением, каждое из которых имеет разный тип. Таким образом, значения item_1 могут относиться к типу даты, item_2 — к строке и т. д. Я по-прежнему мог поместить все эти значения в столбец с одним строковым типом, но тогда я не мог выполнять собственные запросы к этому столбцу, такие как вычисление даты или SUM. (). - person user151841; 01.02.2010
comment
Да, если они разных типов, то было бы плохой идеей помещать их в одну колонку. - person Mark Byers; 01.02.2010