I would assume Query B would execute faster because it joins fewer tables, but Query A is faster by 2 seconds. Are case statements that intensive?

Query A
Code:
select distinct '100-'+convert(varchar, c.id)+'-0000', c.name, balance, m.lastPaymentDate, m.lastInvoiceDate, datediff(day, lastPaymentDate, getdate()) as daysSinceLastPayment,  datediff(day, m.lastPaymentDate, dateadd(day, 26, m.lastInvoiceDate) ) as daysLate, 
	case when b.balance_1_30-p.totalPayments >= 0.01 then b.balance_1_30-p.totalPayments else 0 end, 
	case when b.balance_31_60-p.totalPayments >= 0.01 then b.balance_31_60-p.totalPayments else 0 end,
	case when b.balance_61_90-p.totalPayments >= 0.01 then b.balance_61_90-p.totalPayments else 0 end,
	case when b.balance_over_90-p.totalPayments >= 0.01 then b.balance_over_90-p.totalPayments else 0 end,
	case when s.activeContracts > 0 then 'Active' else 'Inactive' end as active
from customers c
inner join (select l.customer_id,
			sum(case when cs.name = 'Active' and con.install_date is not null and con.billable = 1 then 1 else 0 end) as activeContracts
		from locations l
		inner join contracts con on con.location_id = l.id
		inner join contract_statuses cs on cs.id = con.status_id
		where con.install_date is not null
		group by l.customer_id) s on s.customer_id = c.id
inner join (select t.customer_id, sum(t.amount) as balance, max(case when tt.name like '%payment%' then t.transaction_date end) as lastPaymentDate, max(i.invoice_date) as lastInvoiceDate
		from transactions t 
		left join invoices i on i.id = t.invoice_id
		inner join transaction_types tt on tt.id = t.type_id 
		group by t.customer_id) m on m.customer_id = c.id
left join (select customer_id, sum(amount)*-1 as totalPayments
		from transactions t
		inner join transaction_types tt on tt.id = t.type_id
		where tt.name like '%payment%'
		group by customer_id) p on p.customer_id = c.id
inner join (select customer_id, 
			sum(case when DATEDIFF(DAY, transaction_date, getdate()) > 0 THEN amount ELSE 0 END) AS balance_1_30,
			sum(case when DATEDIFF(DAY, transaction_date, getdate()) > 30 THEN amount ELSE 0 END) AS balance_31_60,
			sum(case when DATEDIFF(DAY, transaction_date, getdate()) > 60 THEN amount ELSE 0 END) AS balance_61_90,
			sum(case when DATEDIFF(DAY, transaction_date, getdate()) > 90 THEN amount ELSE 0 END) AS balance_over_90
		from transactions t
		inner join transaction_types tt on tt.id = t.type_id
		where tt.name not like '%payment%'
		group by customer_id) b on b.customer_id = c.id
order by case when s.activeContracts > 0 then 'Active' else 'Inactive' end, c.name
Query B

Code:
select distinct '100-'+convert(varchar, c.id)+'-0000', c.name, balance, m.lastPaymentDate, m.lastInvoiceDate, datediff(day, m.lastPaymentDate, getdate()) as daysSinceLastPayment,  datediff(day, m.lastPaymentDate, dateadd(day, 26, m.lastInvoiceDate) ) as daysLate, 
	case when m.balance_1_30-m.totalPayments >= 0.01 then m.balance_1_30-m.totalPayments else 0 end, 
	case when m.balance_31_60-m.totalPayments >= 0.01 then m.balance_31_60-m.totalPayments else 0 end,
	case when m.balance_61_90-m.totalPayments >= 0.01 then m.balance_61_90-m.totalPayments else 0 end,
	case when m.balance_over_90-m.totalPayments >= 0.01 then m.balance_over_90-m.totalPayments else 0 end,
	case when s.activeContracts > 0 then 'Active' else 'Inactive' end as active
from customers c
inner join (select l.customer_id,
			sum(case when cs.name = 'Active' and con.install_date is not null and con.billable = 1 then 1 else 0 end) as activeContracts
		from locations l
		inner join contracts con on con.location_id = l.id
		inner join contract_statuses cs on cs.id = con.status_id
		where con.install_date is not null
		group by l.customer_id) s on s.customer_id = c.id
inner join (select t.customer_id, sum(t.amount) as balance, 
		max(case when tt.name like '%payment%' then t.transaction_date end) as lastPaymentDate, 
		max(i.invoice_date) as lastInvoiceDate,
		sum(case when tt.name like '%payment%' then t.amount end) as totalPayments,
		sum(case when tt.name not like '%payment%' and DATEDIFF(DAY, transaction_date, getdate()) > 0 THEN amount ELSE 0 END) AS balance_1_30,
		sum(case when tt.name not like '%payment%' and DATEDIFF(DAY, transaction_date, getdate()) > 30 THEN amount ELSE 0 END) AS balance_31_60,
		sum(case when tt.name not like '%payment%' and DATEDIFF(DAY, transaction_date, getdate()) > 60 THEN amount ELSE 0 END) AS balance_61_90,
		sum(case when tt.name not like '%payment%' and DATEDIFF(DAY, transaction_date, getdate()) > 90 THEN amount ELSE 0 END) AS balance_over_90
		from transactions t 
		left join invoices i on i.id = t.invoice_id
		inner join transaction_types tt on tt.id = t.type_id 
		group by t.customer_id) m on m.customer_id = c.id
order by case when s.activeContracts > 0 then 'Active' else 'Inactive' end, c.name