2015-08-07 3 views
1

У меняется следующая структура базы данных:SQL Query - Group and SUM of values ​​

ID: Оплата (десятичная) | PaymentDate (DateTime) | PaymentStatus (int)

В настоящее время я могу получить группировку всех платежей с течением времени по Году и дате и получить общее количество по всему статусу платежа, используя следующий запрос;

Select 
YEAR = YEAR(DueDate), 
MONTH = MONTH(DueDate), 
MMM = UPPER(left(DATENAME(MONTH,DueDate),3)), 
Totals = sum(Payment) 
from 
PaymentSchedules 
Where DueDate IS NOT NULL 
Group by 
YEAR(DueDate), 
MONTH(DueDate), 
DATENAME(Month,DueDate) 
Order By 
YEAR, 
MONTH 

Это дает мне результаты, которые так хороши.

enter image description here

То, что я хотел бы быть в состоянии сделать это добавили итоги для расколов в каждой секции. Например, если каждый платеж может быть оплачен (1) или неоплаченным (2) или просроченным (3), я хотел бы не только получить количество оплаченных/неоплаченных/просроченных, но также хотел бы получить общую стоимость неоплаченных предметов/оплаченные предметы/Просроченные предметы для каждой комбинации Год/Месяц.

ответ

4

Вам просто нужно добавить SUM с с CASE операторов внутри только выплаты сумм при обнаружении правильного состояния, например:

Select YEAR = YEAR(DueDate), 
     MONTH = MONTH(DueDate), 
     MMM = UPPER(left(DATENAME(MONTH,DueDate),3)), 
     TotalPaid = sum(case when PaymentStatus = 1 then Payment else 0 end), 
     TotalUnpaid = sum(case when PaymentStatus = 2 then Payment else 0 end), 
     TotalOverdue = sum(case when PaymentStatus = 3 then Payment else 0 end), 
     Totals = sum(Payment) 
from PaymentSchedules 
Where DueDate IS NOT NULL 
Group by YEAR(DueDate), 
     MONTH(DueDate), 
     DATENAME(Month,DueDate) 
Order By YEAR, 
     MONTH 
+0

Поблагодарите you..this является совершенным, и я узнал что-то новое :) –

+0

Один дополнительный query..the Sum работает прекрасно, но когда я попытался сделать TOTAL оплаченных (то есть, сколько оплат заплачено за это время), он не работал ... предоставил все, что я сделал, это изменение SUM для COUNT .. Я предполагаю, что это неправильно? И что означает «then pay else 0» в запросе? –

+0

Если вы изменили 'sum' на' count', это изменит значение, да. 'sum (payment)' фактически суммирует значения 'payment' для каждой обрабатываемой строки, где в качестве' count (payment) 'будет указано количество строк, в которых значение' payment' не равно null. – sstan

1

Поскольку существует только три категории, я хотел бы предложить использовать сазе напрямую ,

Select 
YEAR = YEAR(DueDate), 
MONTH = MONTH(DueDate), 
MMM = UPPER(left(DATENAME(MONTH,DueDate),3)), 
Paid_sum = sum(CASE When PaymentStatus = 1 THEN Payment ELSE 0 END), 
Unpaid_sum = sum(CASE When PaymentStatus = 2 THEN Payment ELSE 0 END), 
Overdue_sum = sum(CASE When PaymentStatus = 3 THEN Payment ELSE 0 END), 
Totals = sum(Payment) 
from 
PaymentSchedules 
Where DueDate IS NOT NULL 
Group by 
YEAR(DueDate), 
MONTH(DueDate), 
DATENAME(Month,DueDate) 
Order By 
YEAR, 
MONTH