1

我做了一个基本的火鸟报告来呼吁所有债务人和交易报告看起来如下


SELECT 
POSPAY.TXNO,
DEBTORS.COMPANY,
POSPAY.AMOUNT,
POSINVTRANS.TXDATE
FROM
POSPAY
INNER JOIN DEBTORS ON (POSPAY.ACCTNUMBER = DEBTORS.ACCOUNT)
INNER JOIN POSINVTRANS ON (POSPAY.TXNO = POSINVTRANS.TXNO)
WHERE
PAYMNTTYPID = '7' 
and  
weekly = :weekly and
txdate >= :fromdate and
txdate <= :todate

这可以正常工作,并为我提供债务人姓名、TXNO、TXDATE、AMOUNT 的输出

我现在想写一个类似的报告,但需要对债务人进行分组并给出交易总额,即我需要输出债务人姓名(如果 JOHN 是两次,需要列出一次),总金额(约翰交易的总和)

我仍然需要对债务人进行内部连接,但不再需要对 posinvtrans,我认为它应该看起来像

SELECT 
POSPAY.TXNO,
DEBTORS.COMPANY,
POSPAY.AMOUNT

FROM
POSPAY
INNER JOIN DEBTORS ON (POSPAY.ACCTNUMBER = DEBTORS.ACCOUNT)

WHERE
PAYMNTTYPID = '7' 
and  
weekly = :weekly and
txdate >= :fromdate and
txdate <= :todate

Group by DEBTORS.COMPANY

但没有运气,在 Group by '选择列表中的无效表达式(不包含在聚合函数或 GROUP BY CLAUSE 中) '有什么建议吗?

4

2 回答 2

1

选择列表中的字段列表必须也列在group by列表中,或者是聚合函数,如count(*),max(amount)等。

问题是你没有告诉 Firebird 该怎么做,POSPAY.TXNO而且POSPAY.AMOUNT仅仅告诉你想要发生在他们身上的事情是不够的。

我建议您从查询中删除这 2 个字段并选择DEBTORS.COMPANY,sum(POSPAY.AMOUNT)作为起点。

于 2013-06-24T14:36:00.930 回答
0

如果您使用GROUP BY,则需要在 中包含一列GROUP BY,或在该列上应用聚合函数。在您的示例中,您需要省略POSPAY.TXNO,因为这是特定于事务的(或者您可以使用聚合函数LIST),并且您需要应用聚合函数SUMAMOUNT获得总数:

SELECT 
DEBTORS.COMPANY,
SUM(POSPAY.AMOUNT)

FROM
POSPAY
INNER JOIN DEBTORS ON (POSPAY.ACCTNUMBER = DEBTORS.ACCOUNT)

WHERE
PAYMNTTYPID = '7' 
and  
weekly = :weekly and
txdate >= :fromdate and
txdate <= :todate

Group by DEBTORS.COMPANY
于 2013-06-24T14:32:58.463 回答