一道sql题,不知道有好解决方法没有?

原创 2007年09月26日 20:26:00

create table tb(ID int,Time datetime)
insert tb select 1,'2005/01/24 16:20'
union all select 2,'2005/01/23 22:45'
union all select 3,'2005/01/23 0:30'
union all select 4,'2005/01/21 4:28'
union all select 5,'2005/01/20 13:22'
union all select 6,'2005/01/19 20:30'
union all select 7,'2005/01/19 18:23'
union all select 8,'2005/01/18 9:14'
union all select 9,'2005/01/18 18:04'
go

要得到以下结果:

所選時段            Mon   Tue   Wed   Thu   Fri   Sat   Sun   Total
--------------         -----     -----   -----     -----  -----  ------ ----     ------
[5pm - 9pm)       0        1        2         0       0       0      0       3
[9pm - 1am)       0        0        0         0       0       0      2       2
[1am - 4am)       0        0        0         0       0       0      0       0
[4am - 8:30am) 0        0        0         0       1        0     0       1
[8:30am - 1pm) 0       1         0         0       0        0     0       1
[1pm - 5pm)      1        0         0        1       0        0     0       2
Total                   1         2        2        1        1        0     2       9

 

select y as '所过时段',
       mon=sum(isnull((case when x=2 then z end),0)),
       Tue=sum(isnull((case when x=3 then z end),0)),
       Wed=sum(isnull((case when x=4 then z end),0)),
       Thu=sum(isnull((case when x=5 then z end),0)),
       Fri=sum(isnull((case when x=6 then z end),0)),
       Six=sum(isnull((case when x=7 then z end),0)),
       Sun=sum(isnull((case when x=1 then z end),0)),
       Total=sum(z)
from
 (select x,y,count(*) z
   from
   (select x=DATEPART(dw,time),
        y=case
            when  DATEPART(hh,time)>=17 and DATEPART(hh,time)<21 then '[5pm - 9pm)'
            when  ((DATEPART(hh,time)>=4 and DATEPART(hh,time)<8) or (DATEPART(hh,time)=8 and DATEPART(n,time)<30)) then '[4am - 8:30am)'
            when  DATEPART(hh,time)<13 and DATEPART(hh,time)>8 or(DATEPART(hh,time)=8 and DATEPART(mi,time)>=30) then '[8:30am - 1pm)'
            when  DATEPART(hh,time)>=13 and DATEPART(hh,time)<17 then '[1pm - 5pm)'
            when  (DATEPART(hh,time)>=21 or DATEPART(hh,time)<1) then '[9pm - 1am)'
            when  DATEPART(hh,time)>=1 and DATEPART(hh,time)<4 then '[1am - 4am)'
         end
   from tb) b
 group by x,y) c
group by y
union all
select 'Total' as '所过时段',
       mon=(select count(*) from tb where DATEPART(dw,time)=2),
       Tue=(select count(*) from tb where DATEPART(dw,time)=3),
       Wed=(select count(*) from tb where DATEPART(dw,time)=4),
       Thu=(select count(*) from tb where DATEPART(dw,time)=5),
       Fri=(select count(*) from tb where DATEPART(dw,time)=6),
       Six=(select count(*) from tb where DATEPART(dw,time)=7),
       Sun=(select count(*) from tb where DATEPART(dw,time)=1),
       Total=(select count(*) from tb)

感觉以上的查询方法比较苯。

极限初学者常遇到的几个坑(二)

由于编辑仓促,第一篇中出现了这两个问题:     1.传的那个文档没有通过审核,所以我从网上找到了原址分享一下:https://arxiv.org/pdf/math/0508227.pdf     2...
  • qq_31474315
  • qq_31474315
  • 2016年11月05日 15:15
  • 662

西普实验吧CTF-算术题

题目描述: 一道小学算术题,但是好多老师不会,不知道为什么   解题链接: http://ctf1.shiyanbar.com/program/2/ 真是数学题,排除后发现只能在中...
  • u010379510
  • u010379510
  • 2016年03月29日 18:38
  • 1126

又一道简单题

又一道简单题 Time Limit: 5000MS Memory Limit: 65535KB 64bit IO Format: SubmitStatusDescriptio...
  • qq_32792879
  • qq_32792879
  • 2016年08月23日 16:50
  • 260

学生给老师的一道思考题

某一天某个老师对某个学生说“你现在已经旷课10学时,按照学校的规定需要上报”,该学生对老师说“这门课还能不能过了?如果不能我就不来了!”。 难啊,真难回答!刚开学没有几天,这个学期还有好长时间呢。如果...
  • JavaEETeacher
  • JavaEETeacher
  • 2009年09月11日 13:49
  • 4768

每天一道编程题(1)

现在有一张半径为r的圆桌,其中心位于(x,y),现在他想把圆桌的中心移到(x1,y1)。每次移动一步,都必须在圆桌边缘固定一个点然后将圆桌绕这个点旋转。问最少需要移动几步。 输入描述: 一行五个整数...
  • yj1499945
  • yj1499945
  • 2015年09月24日 10:15
  • 597

每天一道编程题(3)

有一个投篮游戏。球场有p个篮筐,编号为0,1...,p-1。每个篮筐下有个袋子,每个袋子最多装一个篮球。有n个篮球,每个球编号xi。规则是将数字为xi的篮球投到xi除p的余数为编号的袋里。若袋里已有篮...
  • yj1499945
  • yj1499945
  • 2015年09月26日 21:24
  • 475

CDOJ 每周一题div2 这是一道暴力题(暴力/思维)

昨天chipizz突然问我这道题怎么写,我当时就嘴炮AC了一下,感觉似乎很简单啊,于是去CDOJ注册了个帐号打算写写。 拿到这道题的第一想法是预处出现有数字能够组成的所有的能被3整除的一位数还有两位...
  • Murphyc
  • Murphyc
  • 2018年02月03日 19:35
  • 58

一道简单题

问题描述: 给出一个包含N个整数的数组,你需要回答若干询问。每次询问两个整数k和v,输出从左到右第k个v的下标(编号从1开始)。 输入包含两组多组数据。每组数据第一行为两个整数n和m,(1...
  • STILLxjy
  • STILLxjy
  • 2016年05月02日 23:39
  • 345

每日一道算法题——1

求字符串字串的长度。
  • q1242027878
  • q1242027878
  • 2017年02月07日 13:06
  • 574

华为机试第一题[2016年8月18日上午]计算重复字符

题目描述 输入一行字符,统计英文字母的个数,非英文字母直接掠过不统计 例如:输入:AAA^^^%ABBCd98n2    输出:A4B2C1d1n1 首先我想说的是,草,自己的代码能力真渣!!!!!回...
  • wdasdaw
  • wdasdaw
  • 2016年08月18日 17:32
  • 526
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一道sql题,不知道有好解决方法没有?
举报原因:
原因补充:

(最多只允许输入30个字)