Сделайте выбор с одним из столбца на основе другого выбора

Я работаю с 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
Другие вопросы по тегам