СУММА (), берущая только из одной строки - PullRequest
0 голосов
/ 30 октября 2018

Две таблицы: «S» (для «Услуги») и «Платежи». Они связаны друг с другом через «S». «ID-S» ссылается как внешний ключ: «Платежи». «S».

Я пытаюсь создать запрос для выпадающего списка в форме «добавить платеж», но, поскольку я надеюсь разрешить частичные платежи, я хочу вычесть сумму уже выполненных платежей, которые связаны с данным "ID-S". Однако я не могу скрыть услуги, оплаченные несколькими платежами.

Ниже приведен мой текущий код, использующий только одну из категорий «услуг» (в данном случае счета):

SELECT "S"."Invoice" || ' for $' || "S"."Price" -
IIF("Payments"."S" IS NULL, 0, SUM("Payments"."Amount")
AS "To-Pay", "ID-S"
FROM "S"
LEFT OUTER JOIN "Payments" ON "S"."ID-S" = "Payments"."S"
GROUP BY "S"."Invoice", "S"."Price", "Payments"."Amount", "Payments"."S", "S"."ID-S"
HAVING "Payments"."S" IS NULL OR
SUM("Payments"."Amount") < "S"."Price"

Это должно показать, например:

  • 1/1/2018 за 400 * 1011 $
  • 2/1/2018 за 1050 $
  • 6/8/2018 за 750 * 1015 $

и т. Д., Цена - оставшаяся цена Он вообще не должен показывать полностью оплаченные счета.

Насколько я могу судить, проблема в том, что SUM("Payments"."Amount") не суммирует все столбцы «Сумма» с совпадающим «S-ID», он только берет «Сумму» из данной строки. Это не поможет мне ни на шаг, потому что, если, скажем, счет за 3000 долларов будет оплачен двумя платежами по 1000 и 2000 долларов соответственно, список будет не только по-прежнему отображать счет, но и отображать его дважды - один раз с оставшимися 2000 долларов и один раз с оставшимися 1000 $.

Я использую LibreOffice Base с Firebird.

РЕДАКТИРОВАТЬ: При дальнейшем вводе данных я обнаружил один случай двойной оплаты, который был указан выше (два раза с разными «оставшимися ценами»), и еще один такой двойной платеж отображается один раз с ценой «0 долларов», возможно из-за того, что раскололся пополам?

1 Ответ

0 голосов
/ 30 октября 2018

Возможно, вам следует извлечь / инкапсулировать группировку в отдельный запрос. Трудно рассуждать, не видя пример данных, но попробуйте использовать либо Derived Table или Common Table Expression.

Ниже приведены самые лучшие результаты Google, чтобы дать вам общее представление.

Руководство по Firebird находится на https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-dml-select.html

Кроме того, вам действительно нужно, чтобы все это выполнялось на сервере, например, для объединения текстовых строк? Обычно это делается на клиенте с локализацией и украшением шрифта, а что нет.

Шаблон для попытки:

WITH Parts AS ( 
  SELECT ID_S, Sum(Amount) as Done 
  FROM Payments 
  GROUP BY 1
) 
SELECT S.Invoice, S.Price - COALESCE( Parts.Done, 0)
FROM Services S
LEFT JOIN Parts ON S.ID = Parts.ID_S
-- WHERE S.Price > COALESCE( Parts.Done, 0) 
WHERE S.Price > Parts.Done OR Parts.Done IS NULL

или равный образец

SELECT S.Invoice, S.Price - COALESCE( Parts.Done, 0)
FROM Services S
LEFT JOIN ( SELECT ID_S, Sum(Amount) as Done FROM Payments GROUP BY 1) 
     AS Parts ON S.ID = Parts.ID_S
-- WHERE S.Price > COALESCE( Parts.Done, 0) 
WHERE S.Price > Parts.Done OR Parts.Done IS NULL 
...