Группировка совпадающих имен с итоговыми значениями Firebird 2.5

Я сделал базовый отчет Firebird, чтобы обзвонить всех должников и транзакции. Отчет выглядит следующим образом.


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.

Теперь я хочу написать аналогичный отчет, но мне нужно сгруппировать должников и указать итоги по транзакциям, т.е. мне нужно выходное имя должника (если ДЖОН дважды, нужно указать один раз), общая сумма (сумма транзакций Джона)

Мне все еще нужно внутреннее соединение по должникам, но уже не по 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 CLAUSE)' какие-нибудь предложения?


person Vincent Blaauw    schedule 24.06.2013    source источник


Ответы (2)


Список полей в списке выбора должен быть либо также указан в списке group by, либо представлять собой агрегатные функции, такие как count(*), max(amount) и т. д.

Проблема в том, что вы не сказали Firebird, что делать с POSPAY.TXNO и POSPAY.AMOUNT, и этого недостаточно, чтобы сказать, что вы хотите, чтобы с ними произошло.

Я предлагаю вам удалить эти 2 поля из запроса и использовать список выбора DEBTORS.COMPANY, sum(POSPAY.AMOUNT) в качестве отправной точки.

person NickUpson    schedule 24.06.2013
comment
Большое спасибо, Ник Апсон, отчет работает именно так, как я хотел. - person Vincent Blaauw; 25.06.2013

Если вы используете GROUP BY, вам нужно либо включить столбец в GROUP BY, либо применить агрегатную функцию к столбцу. В вашем примере вам нужно пропустить POSPAY.TXNO, так как это зависит от транзакции (или вы можете использовать агрегатную функцию LIST), и вам нужно применить агрегатную функцию SUM к AMOUNT, чтобы получить итог:

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
person Mark Rotteveel    schedule 24.06.2013