Вы можете сделать с подзапросами, чтобы быть более эффективным.Предварительный запрос сгруппирован по каждому клиенту только для тех клиентов, которые соответствуют определенным категориям.Эти подзапросы всегда приводят к не более 1 записи на каждого клиента, поэтому вы не получите декартово результат.Получите это для своих дебетов и кредитов и повторно присоединитесь к своему основному списку клиентов с левым соединением в случае, если одна или другая сторона (дебеты / кредиты) могут не существовать.
declare @StartDate DATE = '2016-08-01'
declare @EndDate DATE = '2016-08-31'
declare @BillingCategory INT = 0
select
c.ID,
c.Name,
c.StartingBalance,
coalesce( AllDebits.xDebits, 0 ) DebitsPrior,
coalesce( AllDebits.Debits, 0 ) Debits
coalesce( AllCredits.xCredits, 0 ) CreditsPrior,
coalesce( AllCredits.Credits, 0 ) Credits
from
customers c
LEFT JOIN
( select t.CustomerID,
sum( case when t.[Date] < @StartDate then Amount else 0 end ) xDebits,
sum( case when t.[Date] >= @StartDate then Amount else 0 end ) Debits
from
customers c1
JOIN Transactions t
on c1.CustomerID = t.CustomerID
where
c1.BillingCategory in (0,1,2,3,4,5)
group by
t.CustomerID ) AllDebits
on c.CustomerID = AllDebits.CustomerID
LEFT JOIN
( select p.CustomerID,
sum( case when p.[Date] < @StartDate then Amount else 0 end ) xCredits,
sum( case when p.[Date] >= @StartDate then Amount else 0 end ) Credits
from
customers c1
JOIN Payments p
on c1.CustomerID = p.CustomerID
where
c1.BillingCategory in (0,1,2,3,4,5)
group by
p.CustomerID ) AllCredits
on c.CustomerID = AllCredits.CustomerID
where
c.BillingCategory in (0,1,2,3,4,5)
ДОБАВЛЕНИЕ КОММЕНТАРИИ
Что касается ответа Томаса, да, они близки.Моя версия также добавляет объединение в таблицу клиентов для определенной категории счетов, и вот почему.Я не знаю размер вашей базы данных, сколько клиентов, сколько транзакций.Если вы имеете дело с большой суммой, которая оказывает влияние на производительность, версия Томаса запрашивает КАЖДОГО клиента и КАЖДУЮ транзакцию.Моя версия опрашивает только квалифицированных клиентов по критериям категории выставления счетов, которые вы ограничили.
Опять же, не зная размера данных, если вы имеете дело с записями по 100 тыс., Может не быть заметной производительности.Если вы имеете дело с 100k КЛИЕНТАМИ, это может быть совсем другая история.
@ JonathanWood, правильно, но в моей версии каждый внутренний подзапрос включает cus