2013-11-21 3 views
0

Мне нужно суммировать данные столбца, только когда дата платежа одинакова.Сумма определенного столбца

Вот возвращенные данные:

judgment PaymentDate interestrate current1 paymentamount principalamount 
2/1/2008 7/31/2010  9.00   5781.04 -315.07  -270.07 
2/1/2008 7/31/2010  9.00   5781.04 272.59   227.59 

Вот запрос:

select tb1.judgment, fulldate as PaymentDate, m.interestrate, m.current1, paymentamount, principalamount from master m 
      inner join AARS_JudgmentsWithPA tb1 on tb1.jmacct = m.number 
      inner join courtcases cc on cc.accountid = m.number 
      where m.lastinterest != '2099-01-01 00:00:00.000' 
      and tb1.fulldate > tb1.judgment 
      and cast(tb1.PrincipalAmount as money) != 0 
      and tb1.judgment != '' 
      and m.number = 568463 

Для примера данных, предоставленных мне нужно эти строки в сочетании, поскольку дата оплаты и тот же. Таким образом, сумма платежа должна быть сокращена до -270,07 + 227,59, что составляет -42,48.

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

Что мне не хватает?

+0

Какие СУБД вы используете? Postgres? Oracle? –

+0

SSMS. Я думаю, это то, что вы ищете. –

+0

Я никогда не слышал о СУБД под названием * SSMS * - что это? –

ответ

1

Вам необходимо настроить агрегацию для столбцов, которые вы не группируете. Для числовых столбцов, которые повторяются MIN(), MAX() или AVG() было бы уместно. Для строковых колонок MIN() или MAX() будет работать.

select tb1.judgment, 
     fulldate as PaymentDate, 
     MIN(m.interestrate) AS interestrate, 
     MIN(m.current1) AS current1, 
     SUM(paymentamount) AS paymentamount, 
     SUM(principalamount) AS principalamount 
from master m 
inner join AARS_JudgmentsWithPA tb1 on tb1.jmacct = m.number 
inner join courtcases cc on cc.accountid = m.number 
where m.lastinterest != '2099-01-01 00:00:00.000' 
    and tb1.fulldate > tb1.judgment 
     and cast(tb1.PrincipalAmount as money) != 0 
     and tb1.judgment != '' 
     and m.number = 568463 
group by tbl.judgment, fulldate 

Другим вариантом было бы сгруппировать по столбцам, которые повторяются и агрегировать остальное:

select tb1.judgment, 
     fulldate as PaymentDate, 
     m.interestrate, 
     m.current1, 
     SUM(paymentamount) AS paymentamount, 
     SUM(principalamount) AS principalamount 
from master m 
inner join AARS_JudgmentsWithPA tb1 on tb1.jmacct = m.number 
inner join courtcases cc on cc.accountid = m.number 
where m.lastinterest != '2099-01-01 00:00:00.000' 
    and tb1.fulldate > tb1.judgment 
     and cast(tb1.PrincipalAmount as money) != 0 
     and tb1.judgment != '' 
     and m.number = 568463 
group by tbl.judgment, fulldate, m.interestrate, m.current1 
0

Вам ничего не хватает, когда вы используете агрегированную функцию, в этом случае sum() вы должны группировать все остальные столбцы без агрегата. Первые несколько приговоренных объяснений объясняются довольно подробно: http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html и список функций, требующих от вас группы: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

+0

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

+0

Вы можете отключить его, но если вы группируете каждый столбец и возвращаете более одной строки, это означает, что вы возвращаете данные с уникальными значениями. Это вызовет именно то, что вы видите, и в этом случае ваши поля основных ресурсов имеют разные данные, поэтому вы возвращаете одну строку для каждой уникальной части данных. –

+0

Хорошо, я понимаю сейчас. Я удалил основной столбец вместе, поскольку в этом расчете не было необходимости. И теперь он возвращает одну строку. –

Смежные вопросы