0

两个表:“S”(代表“服务”)和“付款”。它们通过被称为外键的“S”.“ID-S”联系在一起:“Payments”.“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"

它应该显示,例如:

  • 2018 年 1 月 1 日,400 美元
  • 2018 年 2 月 1 日,售价 1050 美元
  • 2018 年 6 月 8 日,售价 750 美元

等等,价格是要支付的剩余价格。它根本不应该显示完全付清的发票。

据我所知,问题在于SUM("Payments"."Amount")不会将所有“金额”列与匹配的“S-ID”相加,它只需要给定行中的“金额”。这对我一点帮助都没有,因为如果一张 3000 美元的发票分别支付了 1000 美元和 2000 美元的两次付款,那么列表不仅仍会显示发票,而且会显示两次——一次剩余 2000 美元,一次还剩 1000 美元。

我将 LibreOffice Base 与 Firebird 一起使用。

编辑:在进一步输入数据后,我发现如上所述显示了一种双重付款的情况(两次以不同的“剩余价格”显示),而另一种这样的双重付款以“$ 0”的价格显示一次,可能是由于完全分成两半?

4

1 回答 1

0

也许您应该将分组提取/封装到单独的查询中。没有看到示例数据就很难推理,但请尝试使用Derived Tableor Common Table Expression

下面只是最上面的谷歌搜索结果,可以让您大致了解一下。

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 
于 2018-10-30T12:27:04.110 回答