Объединить и агрегировать в двух столбцах - для каждого месяца даже месяцы без данных?

Использование SQL Server 2005.

У меня есть таблица с календарными месяцами

Month,  fiscalorder
june,1
july,2
..
may,12

И еще одна таблица с сотрудниками и повторяющейся месячной суммой

employee, month, amount
john, july, 10
john, july, 3
john, august,2
mary, june, 2
mary, feb, 5

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

Выход:

june, john, 0
july, john, 13
august,john,2
sept, john, 0
..
june,mary,2

person Hell.Bent    schedule 17.10.2012    source источник


Ответы (2)


Предполагая, что Sql-сервер 2005+

Declare @CalenderMonths Table ([Month] Varchar(20),FiscalOrder Int)

Insert Into @CalenderMonths Values
('June',1),('July',2),('August',3),('September',4),('October',5),('November',6),
('December',7),('January',8),('February',9),('March',10),('April',11),('May', 12)

Declare @Employee Table(employee varchar(50), [month] Varchar(20), amount int )
Insert Into @Employee Values('john', 'July', 10),('john', 'July',3),('john','August',2),('mary','June',2),('mary', 'February',5)

;with cte as
(
    Select employee,[month],TotalAmount = sum(amount)
    from @Employee
    group by employee,[month]
)

select x.[Month],x.employee,amount = coalesce(c.TotalAmount,0)
from (
select distinct c.[Month],e.employee
from @CalenderMonths c cross join cte e)x
left join cte c on x.[Month] = c.[Month] and x.employee = c.employee
order by 2
person Niladri Biswas    schedule 18.10.2012

person    schedule
comment
Это не сборка? - person Hell.Bent; 19.10.2012
comment
Нет, не было. Как-то пропустил это требование. Обновлен код выше, чтобы включить это требование. - person Sebastian Meine; 19.10.2012