Надеюсь, я смогу объяснить это достаточно хорошо. У меня 3 таблицы. wo_parts, workorders и part2vendor. Я пытаюсь получить себестоимость всех проданных деталей за месяц. У меня есть это script.
$scoreCostQuery = "SELECT SUM(part2vendor.cost*wo_parts.qty) as total_score
FROM part2vendor
INNER JOIN wo_parts
ON (wo_parts.pn=part2vendor.pn)
WHERE workorder=$workorder";
То, что я пытаюсь сделать, это каждая часть в wo_parts (под партией [pn]). Стоимость этого элемента находится в part2vendor (под номером детали [pn]). Мне нужно, чтобы каждая часть цены в part2vendor умножалась на количество, проданное в wo_parts. Способ, которым все 3 связаны, - workorders.ident = wo_parts.workorder и part2vendor.pn = wo_parts.pn. Надеюсь, кто-то может помочь. Вышеупомянутый script не дает мне то же самое значение, что и при добавлении калькулятором.
Ключевая причина, по которой я мог видеть, что-то вроде этого, будет проблемой типа. Например, это может произойти, если вы используете FLOAT вместо NUMERIC, вы можете получить немного другой ответ. Это ошибка, которая слишком распространена, кстати.
Я бы рекомендовал дважды проверить вашу схему, чтобы убедиться, что вы используете NUMERIC по всей доске здесь. NUMERIC сумасшедший на PostgreSQL, он работает очень хорошо, и он правильно поддерживает операции произвольной точности. Если вы не можете изменить тип данных, введите свои поля в числовое значение в своем запросе.
Типы FLOAT (включая DOUBLE) - это двоичные числа с фиксированной точностью, и они не всегда соответствуют номерам оснований 10. ЦИФРЫ хранятся внутри базы в качестве базы 1000 (что означает 9 цифр на 30 бит), и это очень эффективно для преобразования в/из двоичного кода. Точность также произвольна, хотя она имеет максимум. Однако для финансовых продуктов максимальные значения или точность не являются проблемой с числовыми типами данных. Вы должны использовать их либерально.
Это не ответ, просто комментарий.
Почему бы вам не взять операцию sum/multiply вне инструкции SQL? Я знаю, это кажется глупым, потому что это увеличит строки кода и сложность script, но, imho, всегда хорошо держать коды и предложения SQL как можно дальше.