Предотвращение агрегированных строк общих объемов счетов при использовании GROUPBY для определения процента оплаченных счетов - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь определить общую сумму частичных платежей, сделанных для одной суммы счета, но когда я выполняю ВНУТРЕННЕЕ СОЕДИНЕНИЕ для вычисления частичных платежей, T-SQL автоматически объединяет каждую сумму счета для каждой частичной оплатыэто, искажая итоги счета.Это не выдает никаких ошибок, но я перепробовал все, что мог придумать, поэтому, если у кого-нибудь есть какие-либо полезные советы о том, как подойти к этому, это будет высоко ценится!

    DECLARE @StartYear INT 
SET @StartYear = '2014'

DECLARE @EndYear INT 
SET @EndYear = '2018'

SELECT 
COUNT(i.InvoiceKey) AS InvoiceKey, 
ISNULL(YEAR(p.TransPostDate), @StartYear) AS PaymentYear, 
SUM(i.Amt) AS InvoiceAmount,
SUM(p.Amt) AS PartialPaymentsTotalsAmount
FROM .[Invoices] i
INNER JOIN [Payments] p ON i.InvoiceKey = p.InvoiceKey
WHERE i.ClientKey = '518' 
AND p.InvClientKey = '518'
AND i.CloseDate IS NULL 
AND (p.TransPostDate IS NOT NULL OR ((YEAR(p.TransPostDate) * 100)) BETWEEN ((@StartYear * 100)) AND ((@EndYear * 100)) )
GROUP BY i.InvoiceKey, YEAR(p.TransPostDate)
ORDER BY YEAR(p.TransPostDate) ASC;

1 Ответ

0 голосов
/ 11 декабря 2018

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

declare @StartYear int  = '2014';
declare @EndYear int = '2018';

select count(i.InvoiceKey) as [Number of Payments made on Invoice]
       -- this will never by null because of the WHERE clause
      ,year(p.TransPostDate) as PaymentYear
       -- I assume multiple payments to one invoice, so don't want to sum here.
       -- All values are the same, just take the MAX. MIN would work too.
      ,max(i.Amt) as [Invoice Amount]
      ,sum(p.Amt) as [Total Payment Made]
       -- count of partial payments
      ,count(case when p.Amt < i.Amt then i.InvoiceKey end) [Number of partial payments made]
       -- sum of partial payments
      ,sum(case when p.Amt < i.Amt then p.Amt end) [Sum of partial payments made]
from.[Invoices] i
inner join [Payments] p
on i.InvoiceKey = p.InvoiceKey
where i.ClientKey = '518'
      and p.InvClientKey = '518'
      and i.CloseDate is null
      -- if this is not true, then by definition p.TransPostDate is not null so
      -- you don't need to specify "p.TransPostDate IS NOT NULL".
      -- There is no need to multiply by 100
      and year(p.TransPostDate) between @StartYear and @EndYear
group by i.InvoiceKey
        ,year(p.TransPostDate)
order by year(p.TransPostDate) asc;
...