统计一段星期的数据的sql,高手请进

jcdwin7 2004-01-30 08:30:32
我现在有一个字段zje,类型为int,另外有一个字段为rq,为datatime类型
想得到以下结果排序
比如统计的时间为2004年1月1号到10号
周日 周一 周二 周三 周四 周五 周六

sum(zje) sum(zje) sum(zje) sum(zje)
.............

sum(zje)

这个sql应该怎么写?
...全文
41 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jianli2004 2004-02-02
  • 打赏
  • 举报
回复
取得周名 如周一
jcdwin7 2004-02-02
  • 打赏
  • 举报
回复
看group by明白了,谢谢
jcdwin7 2004-02-02
  • 打赏
  • 举报
回复
哦,是不是w=datename(week,rq),是取得上面的星期分类;wk=datepart(weekday,rq),是取得左边的日期?
jcdwin7 2004-02-01
  • 打赏
  • 举报
回复
w=datename(week,rq)
是什么意思?
有什么作用呢?
zjcxc 2004-01-31
  • 打赏
  • 举报
回复
--下面是一个简单的测试

--测试数据
declare @表 table(zje int,rq datetime)
insert into @表
select 1,'2004-1-03'
union all select 2,'2004-1-13'
union all select 3,'2004-1-13'
union all select 4,'2004-1-10'
union all select 5,'2004-1-02'
union all select 6,'2004-1-02'
union all select 7,'2004-1-03'
union all select 8,'2004-1-05'
union all select 9,'2004-1-06'
union all select 10,'2004-1-07'
union all select 11,'2004-1-08'
union all select 1,'2004-1-08'
union all select 13,'2004-1-09'
union all select 14,'2004-1-23'
union all select 15,'2004-1-01'
union all select 16,'2004-1-03'

--查询处理
select 区间=right(convert(char(10),min(rq),102),5)
+'~'+right(convert(char(10),max(rq),102),5)
,周日=sum(case wk when 1 then zje else 0 end)
,周一=sum(case wk when 2 then zje else 0 end)
,周二=sum(case wk when 3 then zje else 0 end)
,周三=sum(case wk when 4 then zje else 0 end)
,周四=sum(case wk when 5 then zje else 0 end)
,周五=sum(case wk when 6 then zje else 0 end)
,周六=sum(case wk when 7 then zje else 0 end)
from(
select zje,w=datename(week,rq),wk=datepart(weekday,rq),rq
from @表
where rq between '2004-01-01' and '2004-01-10'
) a
group by w
order by 区间

/*--测试结果
区间 周日 周一 周二 周三 周四 周五 周六
-------------- ---- ---- ---- ----- --- ---- ----
01.01~01.03 0 0 0 0 15 11 24
01.05~01.10 0 8 9 10 12 13 4

(所影响的行数为 2 行)
--*/
zjcxc 2004-01-31
  • 打赏
  • 举报
回复
--如果你的日期不跨年,即显示为楼主的效果,区间只显示月份及日期,用:

select 区间=right(convert(char(10),min(rq),102),5)
+'~'+right(convert(char(10),max(rq),102),5)
,周日=sum(case wk when 1 then zje else 0 end)
,周一=sum(case wk when 2 then zje else 0 end)
,周二=sum(case wk when 3 then zje else 0 end)
,周三=sum(case wk when 4 then zje else 0 end)
,周四=sum(case wk when 5 then zje else 0 end)
,周五=sum(case wk when 6 then zje else 0 end)
,周六=sum(case wk when 7 then zje else 0 end)
from(
select zje,w=datename(week,rq),wk=datepart(weekday,rq),rq
from @表
where rq between '2004-01-01' and '2004-01-10'
) a
group by w
order by 区间
zjcxc 2004-01-31
  • 打赏
  • 举报
回复
--那就是这样写:

select 区间=convert(char(10),min(rq),102)+'~'+convert(char(10),max(rq),102)
,周日=sum(case wk when 1 then zje else 0 end)
,周一=sum(case wk when 2 then zje else 0 end)
,周二=sum(case wk when 3 then zje else 0 end)
,周三=sum(case wk when 4 then zje else 0 end)
,周四=sum(case wk when 5 then zje else 0 end)
,周五=sum(case wk when 6 then zje else 0 end)
,周六=sum(case wk when 7 then zje else 0 end)
from(
select zje,w=datename(week,rq),wk=datepart(weekday,rq),rq
from 表
where rq between '2004-01-01' and '2004-01-10'
) a
group by w
order by 区间
yoki 2004-01-30
  • 打赏
  • 举报
回复
补充一下:
用datepart(weekday,getdate())
取决于SET DATEFIRST 的设置值,若改变过用上述就不能得到正确的,最好是这样:

SET DATEFIRST 7 --加上这句
select 周日=sum(case wk when 1 then zje else 0 end)
,周一=sum(case wk when 2 then zje else 0 end)
,周二=sum(case wk when 3 then zje else 0 end)
,周三=sum(case wk when 4 then zje else 0 end)
,周四=sum(case wk when 5 then zje else 0 end)
,周五=sum(case wk when 6 then zje else 0 end)
,周六=sum(case wk when 7 then zje else 0 end)
from(
select zje,wk=datepart(weekday,rq)
from 表
where rq between '2004-01-01' and '2004-01-10'
) a
seekmoon 2004-01-30
  • 打赏
  • 举报
回复
xuexi
zjcxc 2004-01-30
  • 打赏
  • 举报
回复
select 周日=sum(case wk when 1 then zje else 0 end)
,周一=sum(case wk when 2 then zje else 0 end)
,周二=sum(case wk when 3 then zje else 0 end)
,周三=sum(case wk when 4 then zje else 0 end)
,周四=sum(case wk when 5 then zje else 0 end)
,周五=sum(case wk when 6 then zje else 0 end)
,周六=sum(case wk when 7 then zje else 0 end)
from(
select zje,wk=datepart(weekday,rq)
from 表
where rq between '2004-01-01' and '2004-01-10'
) a

txlicenhe 2004-01-30
  • 打赏
  • 举报
回复
select sum(case when datepart(weekday,rq) = 1 then zje else 0 end) as 周日,
sum(case when datepart(weekday,rq) = 2 then zje else 0 end) as 周一,
sum(case when datepart(weekday,rq) = 3 then zje else 0 end) as 周二,
sum(case when datepart(weekday,rq) = 4 then zje else 0 end) as 周三,
sum(case when datepart(weekday,rq) = 5 then zje else 0 end) as 周四,
sum(case when datepart(weekday,rq) = 6 then zje else 0 end) as 周五,
sum(case when datepart(weekday,rq) = 7 then zje else 0 end) as 周六
from 表
where rq between '2004-01-01' and '2004-01-10'
jcdwin7 2004-01-30
  • 打赏
  • 举报
回复
不好意思,我还想知道
我现在有一个字段zje,类型为int,另外有一个字段为rq,为datatime类型
想得到以下结果排序
比如统计的时间为2004年1月1号到10号
周日 周一 周二 周三 周四 周五 周六

1.01-1.03 sum(zje) sum(zje) sum(zje)
1.04-1.10 .............

sum(zje)

这个sql应该怎么写?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧