Суммируйте все значения, игнорируя минус

56
6

Итак, у меня есть таблица значений mySQL. Некоторые из них положительные, некоторые отрицательные. Отрицательные имеют перед собой в таблице. Я использую Codeigniter.

Мне нужно суммировать их все вместе, но IGNORE - перед отрицательными значениями. Я просто хочу суммировать числа, а не суммировать их как отрицательные числа.

Так, например, это то, что он делает в настоящее время: -55 + -20 = 35

Но я хочу, чтобы это было: -55 + -20 = 75

В принципе, я хочу только суммировать значения, независимо от их положительного или отрицательного типа.

Как я могу это сделать? Здесь мой запрос:

$this->db->select_sum('vat')
->from('accounts')->where_in('type', 'Expenses')
->where('date <=', $current_period)
->where('date >=', $previous_period);

спросил(а) 2012-08-06T16:20:00+04:00 7 лет, 12 месяцев назад
1
Решение
97

Возможно, что-то вроде этого будет работать:

$this->db->select('SUM(CASE WHEN vat >= 0 THEN vat ELSE -vat END) AS sum', false)->from('accounts')->where_in('type', 'Expenses')->where('date <=', $current_period)->where('date >=', $previous_period);

Это должно поддерживать положительные числа в положительном vat и конвертировать отрицательные числа в положительные. Примечание: false в предложении select() останавливает CI от автоматического экранирования полей.

Кроме того, как видно из комментария @shubhansh, вы можете использовать метод MySQL ABS() чтобы получить абсолютное значение вместо CASE:

$this->db->select('SUM(ABS(vat)) AS sum', false)->from('accounts')->where_in('type', 'Expenses')->where('date <=', $current_period)->where('date >=', $previous_period);

ответил(а) 2012-08-06T16:26:00+04:00 7 лет, 12 месяцев назад
39

У меня была та же проблема, что и поиск по дате на уровне db. Лучше всего было бы использовать ABS(), поскольку time_diff возвращает отрицательное значение, если результат в прошлом. Если вы работаете с date_diff или TIME_DIFF, используйте это:

TIME(ABS(TIMEDIFF(TIME(sch_Starts), TIME("22:00:00"))))

он принимает, возможно, отрицательный результат, преобразует его через АБС и обматывает TIME() вокруг этого, чтобы преобразовать обратно во времени, если u использует определенные по времени функции, такие как я.

Возможно, утомительно, но он работает на 100%

ответил(а) 2014-09-05T09:09:00+04:00 5 лет, 11 месяцев назад
39

Я могу думать о двух путях.

Первый способ: я уверен, что CI избегает имен полей, поэтому для этого вам нужно выполнить обычный запрос:

$this->db->query('SELECT SUM(AVG(vat)) FROM accounts WHERE ...'); // Replace ... with WHERE parameters 

Второй способ: либо выполнить два запроса и суммировать результаты:

$positive = $this->db->select_sum('vat')->from('accounts')->where_in('type', 'Expenses')->where('date <=', $current_period)->where('date >=', $previous_period)->where('vat >=', 0);
$negative = $this->db->select_sum('vat')->from('accounts')->where_in('type', 'Expenses')->where('date <=', $current_period)->where('date >=', $previous_period)->where('vat <', 0);
$result = $positive + abs($negative);

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

ответил(а) 2012-08-06T16:29:00+04:00 7 лет, 12 месяцев назад
-4

Вы всегда можете попробовать:

where table.field NOT LIKE '%-%'

ответил(а) 2014-09-18T21:10:00+04:00 5 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема