select 姓名, datepart(week,日期)-datepart(week,dateadd(day,-day(日期)+1,日期))+1 第几周 ... from t group by 姓名,datepart(week,日期)-datepart(week,dateadd(day,-day(日期)+1,日期))+1
select 姓名 ,第几周='第'+cast(第几周 as varchar)+'周' ,日期范围=replace(convert(varchar(5) ,case when dateadd(week,第几周,'2004-8-23')<'2004-9-1' then '2004-9-1' else dateadd(week,第几周,'2004-8-23') end ,1),'/','月')+'号' +'-'+replace(convert(varchar(5) ,case when dateadd(week,第几周,'2004-8-29')>'2004-9-30' then '2004-9-30' else dateadd(week,第几周,'2004-8-29') end ,1),'/','月')+'号' +replace(convert(varchar(5),dateadd(week,1,'2004-9-5'),1),'/','月')+'号' ,数据一,数据二 from( select 姓名 ,第几周=datediff(week,'2004-8-31',日期-1)+1 ,数据一=sum(数据一) ,数据二=sum(数据二) from 表 where 日期 between '2004-9-1' and '2004-9-30' --统计的日期范围 group by 姓名,datediff(week,'2004-8-31',日期-1) )a
注意周数,楼主要求的周是周一到周日,sql的函数是按周日到周一
zjcxc,你好!我说的日期某个月是变的,不是说就是9月。就是某个月的每周的统计情况!
--示例存储过程 create proc p_qry @年月 char(6)='200408' ----要查询的月份,假设查询:2004年8月 as set nocount on --查询参数处理 declare @dt1 datetime,@dt2 datetime declare @dta datetime,@dtb datetime select @dt1=@年月+'01',@dt2=dateadd(month,1,@dt1) ,@dtb=dateadd(day ,case when (@@datefirst+datepart(weekday,@dt1)-1)%7=0 then -7 else -(@@datefirst+datepart(weekday,@dt1)-1)%7 end ,@dt1) ,@dta=dateadd(day,-6,@dtb)--查询出结果 select 姓名 ,第几周='第'+cast(第几周 as varchar)+'周' ,日期范围=replace(convert(varchar(5) ,case when dateadd(week,第几周,@dta)<=@dt1 then @dt1 else dateadd(week,第几周,@dta) end ,1),'/','月')+'号' +'-'+replace(convert(varchar(5) ,case when dateadd(week,第几周,@dtb)<@dt2 then dateadd(week,第几周,@dtb) else @dt2-1 end ,1),'/','月')+'号' ,数据一,数据二 from( select 姓名 ,第几周=datediff(week,@dt1-1,日期-1)+1 ,数据一=sum(数据一) ,数据二=sum(数据二) from 表 where 日期>=@dt1 and 日期<@dt2 group by 姓名,datediff(week,@dt1-1,日期-1) )a
datepart(week,日期)-datepart(week,dateadd(day,-day(日期)+1,日期))+1 第几周
...
from t
group by 姓名,datepart(week,日期)-datepart(week,dateadd(day,-day(日期)+1,日期))+1
select 姓名
,第几周='第'+cast(第几周 as varchar)+'周'
,日期范围=replace(convert(varchar(5)
,case
when dateadd(week,第几周,'2004-8-23')<'2004-9-1'
then '2004-9-1'
else dateadd(week,第几周,'2004-8-23') end
,1),'/','月')+'号'
+'-'+replace(convert(varchar(5)
,case
when dateadd(week,第几周,'2004-8-29')>'2004-9-30'
then '2004-9-30'
else dateadd(week,第几周,'2004-8-29') end
,1),'/','月')+'号'
+replace(convert(varchar(5),dateadd(week,1,'2004-9-5'),1),'/','月')+'号'
,数据一,数据二
from(
select 姓名
,第几周=datediff(week,'2004-8-31',日期-1)+1
,数据一=sum(数据一)
,数据二=sum(数据二)
from 表
where 日期 between '2004-9-1' and '2004-9-30' --统计的日期范围
group by 姓名,datediff(week,'2004-8-31',日期-1)
)a
create proc p_qry
@年月 char(6)='200408' ----要查询的月份,假设查询:2004年8月
as
set nocount on
--查询参数处理
declare @dt1 datetime,@dt2 datetime
declare @dta datetime,@dtb datetime
select @dt1=@年月+'01',@dt2=dateadd(month,1,@dt1)
,@dtb=dateadd(day
,case
when (@@datefirst+datepart(weekday,@dt1)-1)%7=0
then -7
else -(@@datefirst+datepart(weekday,@dt1)-1)%7 end
,@dt1)
,@dta=dateadd(day,-6,@dtb)--查询出结果
select 姓名
,第几周='第'+cast(第几周 as varchar)+'周'
,日期范围=replace(convert(varchar(5)
,case
when dateadd(week,第几周,@dta)<=@dt1
then @dt1
else dateadd(week,第几周,@dta) end
,1),'/','月')+'号'
+'-'+replace(convert(varchar(5)
,case
when dateadd(week,第几周,@dtb)<@dt2
then dateadd(week,第几周,@dtb)
else @dt2-1 end
,1),'/','月')+'号'
,数据一,数据二
from(
select 姓名
,第几周=datediff(week,@dt1-1,日期-1)+1
,数据一=sum(数据一)
,数据二=sum(数据二)
from 表
where 日期>=@dt1 and 日期<@dt2
group by 姓名,datediff(week,@dt1-1,日期-1)
)a