已知数据库结构如图所示:
client_version_code:版本号
login_count:访问量
login_time:访问的时间需求如下图:
根据时间统计今日版本1,版本2,版本3,的日访问量,以及目前3个版本的日访问量总计
根据时间统计昨日版本1,版本2,版本3,的日访问量,以及目前3个版本的日访问量总计
根据时间统计本周版本1,版本2,版本3,的日访问量,以及目前3个版本的日访问量总计
根据时间统计上周版本1,版本2,版本3,的日访问量,以及目前3个版本的日访问量总计
如下省略了,跟图一样(这个在潘迪的帮助下已经写好)。然后点击“本月”要能显示当月所有日期(到当前日期为止)的访问量如图:点击今日要能统计如图:0-1点钟:的版本访问量统计
1-2点钟:的版本访问量统计
一直显示到24小时;只求SQL统计语句。

解决方案 »

  1.   

    需要对登录时间判断
    比如
    判断小时:To_Char(login_time,'hh24'))
    case when 0<=to_number(To_Char(login_time,'hh24'))<1  then 1
    when 1<=to_number(To_Char(login_time,'hh24'))<2  then 1
    ....
    ....
    依次判断每个小时的登录数量
    最后统计就是了应该不是很难
      

  2.   

    月份倒好做,给你个例子
    with t as(
    select 100+level rid,'00000000'||(Mod(LEVEL,4)) client_version_code, LEVEL login_count,
    SYSDATE-level login_time from dual 
    connect by level<=10)
    select 
    To_Char(login_time,'yyyymmdd') 时间,
    Sum(decode(client_version_code,'000000000',login_count)) 版本一,
    Sum(decode(client_version_code,'000000001',login_count)) 版本二,
    Sum(decode(client_version_code,'000000002',login_count)) 版本三,
    Sum(decode(client_version_code,'000000003',login_count)) 版本四,
    Sum(login_count) 总计
    from t
    GROUP BY To_Char(login_time,'yyyymmdd');
      

  3.   

    这个是每小时的例子:with t as(
    select 100+level rid,'00000000'||(Mod(LEVEL,4)) client_version_code, LEVEL login_count,
    SYSDATE+LEVEL/24/30 login_time from dual 
    connect by level<=10)
    SELECT  
    CASE WHEN 0<=tm AND tm<1 THEN '0-1' 
    WHEN 1<=tm AND tm<2 THEN '1-2' 
    WHEN 2<=tm AND tm<3 THEN '2-3' 
    WHEN 3<=tm AND tm<4 THEN '3-4' 
    WHEN 4<=tm AND tm<5 THEN '4-5' 
    WHEN 5<=tm AND tm<6 THEN '5-6' 
    WHEN 6<=tm AND tm<7 THEN '6-7' 
    WHEN 7<=tm AND tm<8 THEN '7-8' 
    WHEN 8<=tm AND tm<9 THEN '8-9' 
    WHEN 9<=tm AND tm<10 THEN '9-10' 
    WHEN 10<=tm AND tm<11 THEN '10-11' 
    WHEN 11<=tm AND tm<12 THEN '11-12' 
    WHEN 12<=tm AND tm<13 THEN '12-13'
    WHEN 13<=tm AND tm<14 THEN '13-14' 
    WHEN 14<=tm AND tm<15 THEN '14-15' 
    WHEN 15<=tm AND tm<16 THEN '15-16' 
    WHEN 16<=tm AND tm<17 THEN '16-17' 
    WHEN 17<=tm AND tm<18 THEN '17-18' 
    WHEN 18<=tm AND tm<19 THEN '18-19'
    WHEN 19<=tm AND tm<20 THEN '19-20'
    WHEN 20<=tm AND tm<21 THEN '20-21'
    WHEN 21<=tm AND tm<22 THEN '21-22'
    WHEN 22<=tm AND tm<23 THEN '22-23'
    ELSE '23-24' END  时间 ,
    版本一,版本二,版本三,版本四,总计
    FROM (
    SELECT  
    To_Number(To_Char(login_time,'hh24')) tm,
    Sum(decode(client_version_code,'000000000',login_count)) 版本一,
    Sum(decode(client_version_code,'000000001',login_count)) 版本二,
    Sum(decode(client_version_code,'000000002',login_count)) 版本三,
    Sum(decode(client_version_code,'000000003',login_count)) 版本四,
    Sum(login_count) 总计
    from t
    GROUP BY To_Char(login_time,'hh24')
    );
      

  4.   

    上面的测试数据,可以稍微改动下,好看实现的结果:with t as(
    select 100+level rid,'00000000'||(Mod(LEVEL,4)) client_version_code, LEVEL login_count,
    SYSDATE+LEVEL*24/3600 login_time from dual 
    connect by level<=30)
      

  5.   


    我把这段SQL语句去掉,然后把T改成表名称,查出来就是我想要的结果,顺便问一下这段SQL的意思,有点看不懂-_-!!!
      

  6.   

    答:
    这段SQL只是创建的临时表T,包含有测试数据。
    一般我们用WITH 来创建一个临时的表,在数据库中是不存在的。
    至于connect by level <=30这些只是创建数据的一个连接条件,你可以查看下Oracle文档,或者Google搜索 connect by 树状结构遍历  多的很
    很多需要你慢慢学习的,我也在学习中……
      

  7.   

    多谢paddy了,以后还有问题会向你请教的,呵呵,结贴