Сделайте выбор с одним из столбца на основе другого выбора
Я работаю с windev, используя базу данных гиперфайла client / serveur.
У меня есть таблица с именем Операции со столбцами (accountNumber, дата, сумма, operationType).
OperationType может принимать два значения: "оплата" и "снятие".
Я хочу выбрать Список операций, выполненных в учетной записи, и в моем Списке должно отображаться 5 столбцов: Дата, номер счета, сумма, тип операции и баланс.
В последнем столбце (сальдо) должна быть разница между суммой всех операций, выполненных до текущей даты с типом "оплата", и суммой всех операций, выполненных до текущей даты с типом "снятие"
Я пытаюсь следующий код SQL
SELECT accountNumber, date as dateOpe, amount, operationType, (SUM (SELECT Operation.amount
FROM Operation
WHERE Operation.date<=dateOpe AND Operation.operationType='payment')
-SUM (SELECT Operation.amount
FROM Operation
WHERE Operation.date<=dateOpe AND Operation.operationType='withdrawal')) as balance
FROM Operation
Но у меня всегда есть ошибка, говорящая мне, что я не имею права помещать выбор в СУММУ
Пожалуйста, кто-нибудь может мне помочь. пожалуйста, как я могу написать такой SQL-запрос.
заранее спасибо
3 ответа
Пожалуйста, попробуйте это:
SELECT accountNumber, date, amount, operationType,
(SELECT SUM(amount) AS balance
FROM operation WHERE operationType='payment' and date=date)
-(SELECT SUM(amount) AS balance
FROM operation WHERE operationType='withdrawal' and date=date)
as balance
FROM operation
Попробуйте что-то вроде следующего, используя подзапрос, чтобы найти суммы. Может быть более элегантное решение, но это должно сработать.
SELECT date, accountNumber,
operationType, deposits - withdrawals AS balance
FROM Operations o INNER JOIN (
SELECT accountNumber, SUM(amount) AS withdrawals
FROM Operaions
WHERE operationType = 'withdrawal'
GROUP BY accountNumber
) a ON o.accountNumber = a.accountNumber
INNER JOIN (
SELECT accountNumber, SUM(amount) AS deposits
FROM Operations
WHERE operationType = 'deposit'
GROUP BY accountNumber
)b ON o.accountNumber = b.accountNumber
Я хотел бы использовать тот факт, что логическое выражение дает 0, если ложь и 1, если истина. Следовательно, Operation.amount * <logical expression>
даст 0, если выражение ложно и Operation.amount
если выражение верно В результате следующий запрос должен быть близок к решению (не проверено):
SELECT accountNumber, date as dateOpe, amount, operationType,
SUM (Operation.amount * (Operation.date<=dateOpe AND Operation.operationType='payment')) -
SUM (Operation.amount * (Operation.date<=dateOpe AND Operation.operationType='withdrawal')) as balance
FROM Operation