Cách dễ nhất để giải quyết câu hỏi của bạn là sử dụng ROLLUP theo nhóm theo truy vấn ( http://technet.microsoft.com/en-us/library/bb522495 (v =sql.105) .aspx )
Đây là SQL Fiddle ( http://sqlfiddle.com/#!3/3ce09/19 )
Định nghĩa ngày:
create table test (
Id INT IDENTITY(1,1),
date DateTime,
balls int );
insert into test(date, balls) values('11/21/2013', 2);
insert into test(date, balls) values('11/22/2013', 3);
insert into test(date, balls) values('11/23/2013', 4);
insert into test(date, balls) values('11/24/2013', 5);
insert into test(date, balls) values('11/25/2013', 2);
insert into test(date, balls) values('11/26/2013', 5);
insert into test(date, balls) values('11/27/2013', 4);
insert into test(date, balls) values('11/28/2013', 3);
insert into test(date, balls) values('11/29/2013', 9);
insert into test(date, balls) values('11/30/2013', 8);
insert into test(date, balls) values('12/01/2013', 7);
insert into test(date, balls) values('12/02/2013', 4);
insert into test(date, balls) values('12/03/2013', 5);
insert into test(date, balls) values('12/04/2013', 6);
insert into test(date, balls) values('12/05/2013', 2);
insert into test(date, balls) values('12/06/2013', 0);
insert into test(date, balls) values('12/07/2013', 1);
Truy vấn thực tế:
select
label,
balls
from (
SELECT
(DATEDIFF(d , '11/21/2013' , date) / 7) as week,
((DATEDIFF(d , '11/21/2013' , date) / 7) + 1) as week1,
LEFT(CONVERT(VARCHAR, (DateAdd(d, (DATEDIFF(d , '11/21/2013' , date) / 7)*7, '11/21/2013')), 120), 10) + ' - ' +
LEFT(CONVERT(VARCHAR, (DateAdd(d, ((DATEDIFF(d , '11/21/2013' , date) / 7) + 1)*7 - 1, '11/21/2013')), 120), 10) as label,
SUM(Balls) as balls
FROM test
GROUP BY rollup((DATEDIFF(d , '11/21/2013' , date) / 7))
) as t
where t.label is not null
Kết quả:
LABEL BALLS
2013-11-21 - 2013-11-27 25
2013-11-28 - 2013-12-04 42
2013-12-05 - 2013-12-11 3