我尝试使用分组集。 样本数据 -
declare @temp table (
ServiceID int not null,
Created Datetime null,
Authorised DateTime null,
Closed Datetime null
)
insert into @temp
select 1, '2016-08-03', '2016-07-03', '2016-02-03' union
select 2, '2016-10-03', '2016-04-03', '2016-08-03' union
select 3, '2016-04-03', '2016-02-03', '2016-12-03' union
select 4, '2016-04-03', '2016-01-03', '2016-10-03'
实际代码 -
;with grouped as (
select created = format(created, 'yyyyMM'),
authorised = format(authorised, 'yyyyMM'),
closed = format(closed, 'yyyyMM'),
count_val = count(*)
from @temp
group by grouping sets(
format(created, 'yyyyMM'),
format(authorised, 'yyyyMM'),
format(closed, 'yyyyMM'))
)
,combined as(
select [Month]=right(created,2),[year]=left(created,4), created=count_val, authorised, closed
from grouped
where created is not null
union all
select [Month]=right(authorised,2),[year]=left(authorised,4), created, authorised=count_val, closed
from grouped
where authorised is not null
union all
select [Month]=right(closed,2),[year]=left(closed,4), created, authorised, closed=count_val
from grouped
where closed is not null
)
select [Month],[year],created=sum(created),authroised=sum(authorised),closed=sum(closed)
from combined
group by [Month],[year]
哇。这是少数。我需要看看是否可以修改,因为我的真正表格实际上有更多的日期/时间列。它看起来不是一个好主意,使8全外连接! – navigator
不要太担心。数据库管理系统是做这种事情的。它可能在这里使用散列连接,这应该很快。请记住,只有少数记录需要连接,因为数据已经汇总。 –