你还没有说你希望收到什么格式的结果。这是我的尝试:
declare @t table (ID int not null,Website varchar(20) not null, Artticles_Count int not null, Date date not null)
insert into @t(ID,Website,Artticles_Count,Date) values
(1 ,'example.com',150 , '20120501'),
(2 ,'example.com',190 , '20120502'),
(3 ,'example.com',219 , '20120503'),
(30,'example.com',4350, '20120530'),
(31,'example.com',4432, '20120531'),
(32,'example.com',4503, '20120601')
select Website,YEAR(Date),MONTH(Date),
MAX(CASE WHEN MONTH(DATEADD(day,-1,Date)) != MONTH(Date) THEN Artticles_Count END) as MonthStart,
MAX(CASE WHEN MONTH(DATEADD(day,1,Date)) != MONTH(Date) THEN Artticles_Count END) as MonthEnd
from @t
where MONTH(DATEADD(day,-1,Date)) != MONTH(Date) or
MONTH(DATEADD(day,1,Date)) != MONTH(Date)
group by Website,YEAR(Date),MONTH(Date)
产生:
Website MonthStart MonthEnd
-------------------- ----------- ----------- ----------- -----------
example.com 2012 5 150 4432
example.com 2012 6 4503 NULL
(我们没有您 6 月份数据的月末数字)
但是,上述内容可能表现不佳 - 如果它对您来说表现不够好,您需要告诉我们。它表现不佳的原因是它排除了索引的使用。可以构建一个替代公式,其中我们使用合理的起始月份和数字表来生成包含所有月份开始/结束日期的 CTE,然后可以将其用于可能能够利用索引的连接中 - 如果存在索引.
以上确实有一个好处 - 很容易看到它在做什么。