Привет всем и спасибо за вашу помощь.
У меня следующая ситуация: таблица с названием операторов, которая содержит поля id (int), stmnt_date (date), debit (double), credit (double) и balance (double)
Я хочу рассчитать остаток по следующим правилам:
Баланс первой строки (в хронологическом порядке ) = дебет - кредит, а для остальных строк
текущий баланс строки = хронологически предыдущий баланс строки + текущий дебет строки - текущий кредит строки
Как вы можете видеть на картинке выше, строки не упорядочены по дате, поэтому я дважды использовал слово в хронологическом порядке, чтобы подчеркнуть важность значения stmnt_date.
Спасибо большое за помощь.
CREATE TABLE
заявления и образцы данных (сINSERT
).Ответы:
Предполагая, что
stmnt_date
у этого естьUNIQUE
ограничение, это было бы довольно легко с оконными / аналитическими функциями:К сожалению, MySQL (пока) не реализовал аналитические функции. Вы можете решить проблему либо с помощью строгого SQL, либо путем самостоятельного присоединения к таблице (которая должна быть довольно неэффективной, хотя и работает на 100%), либо с помощью определенной функции MySQL, переменных (которые были бы весьма эффективными, но вам нужно было бы проверить их при обновлении mysql, чтобы быть уверенным, что результаты все еще верны и не исправлены некоторыми улучшениями оптимизации):
С вашими данными это приведет к:
источник
Я думаю, вы могли бы попробовать следующее:
источник
Ответ ypercube довольно впечатляющий (я никогда не видел создание переменной в одном запросе с помощью подобного фиктивного выбора), поэтому для вашего удобства здесь приведен оператор CREATE TABLE.
Для изображений табличных данных в Поиске картинок Google вы можете использовать https://convertio.co/ocr/ или https://ocr.space/, чтобы преобразовать их в текстовый документ. Затем, если OCR не обнаружил столбцы должным образом, и у вас есть Mac, используйте TextWrangler с нажатой клавишей опции, чтобы выполнить прямоугольное выделение и переместить столбцы. Сочетание редактора SQL, такого как Sequel Pro , TextWrangler, и электронной таблицы, такой как Google Docs, делает работу с табличными данными, разделенными табуляцией, чрезвычайно эффективной.
Если бы я мог поместить все это в комментарии, я бы сделал это, поэтому, пожалуйста, не произносите этот ответ.
источник
Самостоятельно соединять столы не очень быстро на больших столах. Поэтому, решая эту задачу в PostgreSQL, я решил использовать функцию триггера для вычисления сохраненного поля «баланс». Все расчеты происходят только один раз для каждой строки.
источник
Например, в MSSQL:
Используйте оператор with () для генерации CTE. По сути, это временный результирующий набор, который будет показывать значение каждой строки. Вы можете использовать math в операторе with, чтобы создать столбец в конце, используя math, чтобы показать, что сумма строки равна DEBIT-CREDIT. В вашем операторе with вам нужно назначить номера строк каждой строке, используйте предложение OVER WITH () для упорядочения по stmnt_date.
Затем рекурсивно соедините таблицу с самим собой, используя a.ROWNUMBER = b.ROWNUMBER-1 или +1, что позволит вам ссылаться на a.total + b.total = total этой строки и предыдущей строки.
Я ценю, что не предоставляю код, однако это практический метод для достижения этой цели. Я могу предоставить код, если требуется :)
источник