Преобразовать запрос переменной MySQL в запрос SQLite - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть запрос в MySQL, как показано ниже. Я хочу преобразовать этот запрос в запрос SQLite, но SQLite не поддерживает переменные. Как я могу сделать это в SQlite?

SELECT trx_date,@balance opening, net_bill, due, @balance := @balance + net_bill - due closing
FROM transactions, (SELECT @balance := 0) variable
WHERE trx_date BETWEEN '2020-04-01' AND '2020-04-04' ORDER BY trx_date;

1 Ответ

0 голосов
/ 27 апреля 2020

Обновление

Поскольку используемая версия SQLite слишком рано для поддержки оконных функций, другой способ сделать это - LEFT JOIN таблица transactions сама по себе, требующая Значение id в объединенной таблице должно быть ниже. Значения due и bill из объединенной таблицы могут затем суммироваться для получения значений opening и closing:

SELECT t1.trx_date,
       COALESCE(SUM(t2.bill)-SUM(t2.due), 0) AS opening,
       t1.bill,
       t1.due,
       COALESCE(SUM(t2.bill)-SUM(t2.due), 0) + t1.bill - t1.due AS closing
FROM transactions t1
LEFT JOIN transactions t2 ON t2.id < t1.id
GROUP BY t1.id

Выход:

trx_date    bill    due     opening     closing
2020-03-01  100     10      0           90
2020-03-02  50      20      90          120
2020-03-02  100     0       120         220
2020-03-03  200     20      220         400
2020-03-04  110     10      400         500

Демонстрация на dbfiddle

Обратите внимание, что этот запрос также будет выполняться на MySQL.

Исходный ответ

SQLite поддерживает окно функции, что делает этот запрос намного проще:

SELECT trx_date,
       COALESCE(SUM(bill-due) OVER (ORDER BY trx_date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) AS opening,
       bill,
       due,
       SUM(bill-due) OVER (ORDER BY trx_date) AS closing
FROM transactions

Вывод:

trx_date    opening     bill    due     closing
2020-03-01  0           100     10      90
2020-03-02  90          50      20      220
2020-03-02  120         100     0       220
2020-03-03  220         200     20      400
2020-03-04  400         110     10      500

Демонстрация на dbfiddle

Обратите внимание, что когда у вас есть несколько транзакций для данного trx_date вы получите одинаковое значение closing для всех из них. Это можно обойти, если у вас есть другой столбец заказа, который имеет уникальные значения. Смотрите, например, demo , в котором используется столбец id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...