Суммируйте все значения, игнорируя минус
Итак, у меня есть таблица значений 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);
Возможно, что-то вроде этого будет работать:
$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);
У меня была та же проблема, что и поиск по дате на уровне db. Лучше всего было бы использовать ABS(), поскольку time_diff возвращает отрицательное значение, если результат в прошлом. Если вы работаете с date_diff или TIME_DIFF, используйте это:
TIME(ABS(TIMEDIFF(TIME(sch_Starts), TIME("22:00:00"))))
он принимает, возможно, отрицательный результат, преобразует его через АБС и обматывает TIME() вокруг этого, чтобы преобразовать обратно во времени, если u использует определенные по времени функции, такие как я.
Возможно, утомительно, но он работает на 100%
Я могу думать о двух путях.
Первый способ: я уверен, что 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);
Имейте в виду, что второй вариант займет больше времени, так как это два отдельных запроса.
Вы всегда можете попробовать:
where table.field NOT LIKE '%-%'
Еще в рубрике
- Вопросы
- Codeigniter
- Суммируйте все значения, игнорируя минус