解决方案 »

  1.   

    以下是计算20091231为该年的第几周,你可以将你的STARTDATE将其替换后求出每天在改年的周数,然后再对周数进行GROUP BY 求和
    SELECT TO_CHAR(DECODE(SIGN((TO_DATE('20091231', 'YYYYMMDD') +
                               TO_NUMBER(DECODE(TO_CHAR(TRUNC(TO_DATE('20091231',
                                                                       'YYYYMMDD'),
                                                               'YYYY'),
                                                         'D'),
                                                 '1',
                                                 '8',
                                                 TO_CHAR(TRUNC(TO_DATE('20091231',
                                                                       'YYYYMMDD'),
                                                               'YYYY'),
                                                         'D'))) - 2) -
                               LAST_DAY(TO_DATE('20091231', 'YYYYMMDD'))),
                          1,
                          LAST_DAY(TO_DATE('20091231', 'YYYYMMDD')),
                          (TO_DATE('20091231', 'YYYYMMDD') +
                          TO_NUMBER(DECODE(TO_CHAR(TRUNC(TO_DATE('20091231',
                                                                  'YYYYMMDD'),
                                                          'YYYY'),
                                                    'D'),
                                            '1',
                                            '8',
                                            TO_CHAR(TRUNC(TO_DATE('20091231',
                                                                  'YYYYMMDD'),
                                                          'YYYY'),
                                                    'D'))) - 2)),
                   'WW')
      FROM DUAL;
      

  2.   

    首先,可以使用to_char函数来获取第几周,星期几
    select to_char(sysdate,'WW day') from dual;
    然后,有了第几周,就可以用group by来进行统计了
      

  3.   

    +1 
    to_char(sysdate,'WW') 获取当前时间在一年内的周次。
    你的视图用周次group 统计就可以了、
      

  4.   

    你这个sql语句计算2013-11-25,得出来的结果是 48,而用select to_char(sysdate,'WW day') from dual方法得出来的却是47。
      

  5.   

    你这个sql语句计算2013-11-25,得出来的结果是 48,而用select to_char(sysdate,'WW day') from dual方法得出来的却是47。
    我在网上查过,直接用#2的方法就有可能出现差一周的情况,你可以测试一下嘛
      

  6.   

    你这个sql语句计算2013-11-25,得出来的结果是 48,而用select to_char(sysdate,'WW day') from dual方法得出来的却是47。
    我在网上查过,直接用#2的方法就有可能出现差一周的情况,你可以测试一下嘛我测了,你这个方法查出来是对的,2楼查出来是有问题的,比如:2013-01-07为第二周周一,用2楼的方法查出来却是第一周周一。
    不过,对你这个方法不太懂,能否讲解一下?我数据库不熟,特别是这些函数。我看书上说TRUNC(x,y)用来截取,可你这个写法就不懂了。
      

  7.   

    我可以跟你讲一下大致思路,首先to_char(sysdate,'WW day')这个函数是以该年的1月1号为第一周的第一天,每隔7天周数+1,也就是说如果不是因为某些年要多一天(闰年)的话,其实每个日期在这一年的周数都是固定的(都是在1月1号的基础上每隔7天周数+1)。基于这个函数的性质,我们需要为该日期加上该年1月1号所在周被忽略的那些天,然后用TO_CHAR获得自然周。但是当1月1号是周日时,用to_date('','d')计算出来时该周的第一天,但实际上这一天已经是第一周的最后一天了。所以要用DECODE函数特殊处理这一天(如果1月1号是周日,天数就是+8)。此处的trunc只是打印出指定日期的1月1号。再用TO_CHAR(DATE,'D')求出是周几。光是以上的处理还不行,由于你在加上了一月一号所在周被忽略的天数进行处理就可能造成年末的某几天大于365(366)而放入第二年进行处理:
    EXAMPLE:
    20120101是第一周周日,你想将1月2号处理成第二周其实你是加上了1月1号前面的6天来处理的,那么就会找出12月24号以后的日期放入下一年(因为>365),所以需要将年末的日期跨年的日期进行特殊处理(处理成最后一周)。其实刚开始我以为to_char(sysdate,'IW') 可以用,后来发觉不行,它可能将某一年的一月一号处理成上一年的(20060101)。
    不知道你能不能理解,其实你着重要理解to_char(sysdate,'WW')和to_char(sysdate,'IW')是怎么处理日期的
      

  8.   

    你这个sql语句计算2013-11-25,得出来的结果是 48,而用select to_char(sysdate,'WW day') from dual方法得出来的却是47。
    我在网上查过,直接用#2的方法就有可能出现差一周的情况,你可以测试一下嘛我测了,你这个方法查出来是对的,2楼查出来是有问题的,比如:2013-01-07为第二周周一,用2楼的方法查出来却是第一周周一。
    不过,对你这个方法不太懂,能否讲解一下?我数据库不熟,特别是这些函数。我看书上说TRUNC(x,y)用来截取,可你这个写法就不懂了。我可以跟你讲一下大致思路,首先to_char(sysdate,'WW day')这个函数是以该年的1月1号为第一周的第一天,每隔7天周数+1,也就是说如果不是因为某些年要多一天(闰年)的话,其实每个日期在这一年的周数都是固定的(都是在1月1号的基础上每隔7天周数+1)。基于这个函数的性质,我们需要为该日期加上该年1月1号所在周被忽略的那些天,然后用TO_CHAR获得自然周。但是当1月1号是周日时,用to_date('','d')计算出来时该周的第一天,但实际上这一天已经是第一周的最后一天了。所以要用DECODE函数特殊处理这一天(如果1月1号是周日,天数就是+8)。此处的trunc只是打印出指定日期的1月1号。再用TO_CHAR(DATE,'D')求出是周几。光是以上的处理还不行,由于你在加上了一月一号所在周被忽略的天数进行处理就可能造成年末的某几天大于365(366)而放入第二年进行处理:
    EXAMPLE:
    20120101是第一周周日,你想将1月2号处理成第二周其实你是加上了1月1号前面的6天来处理的,那么就会找出12月24号以后的日期放入下一年(因为>365),所以需要将年末的日期跨年的日期进行特殊处理(处理成最后一周)。其实刚开始我以为to_char(sysdate,'IW') 可以用,后来发觉不行,它可能将某一年的一月一号处理成上一年的(20060101)。
    不知道你能不能理解,其实你着重要理解to_char(sysdate,'WW')和to_char(sysdate,'IW')是怎么处理日期的
      

  9.   

    你这个sql语句计算2013-11-25,得出来的结果是 48,而用select to_char(sysdate,'WW day') from dual方法得出来的却是47。
    我在网上查过,直接用#2的方法就有可能出现差一周的情况,你可以测试一下嘛我测了,你这个方法查出来是对的,2楼查出来是有问题的,比如:2013-01-07为第二周周一,用2楼的方法查出来却是第一周周一。
    不过,对你这个方法不太懂,能否讲解一下?我数据库不熟,特别是这些函数。我看书上说TRUNC(x,y)用来截取,可你这个写法就不懂了。似懂非懂,
    其实我现在又遇到了另一个问题,就是在对某一天进行统计的时候,用一条sql语句查询不出来所有的列。
    我是通过日期为分组来统计的,如:select statdate,max(sendqtysum)sendqtysum from  s_send_qty_stat group by statdate;但是这张表还有其他的字段,campaignid,taskid,prmtid,我想把这些字段也展示出来,却不知道改怎么写。 总共需要展示的列是campaignid,taskid,prmtid,statdate,sendqtysum .通过表连接也不行,你可否给看下?
      

  10.   

    你这个sql语句计算2013-11-25,得出来的结果是 48,而用select to_char(sysdate,'WW day') from dual方法得出来的却是47。
    我在网上查过,直接用#2的方法就有可能出现差一周的情况,你可以测试一下嘛我测了,你这个方法查出来是对的,2楼查出来是有问题的,比如:2013-01-07为第二周周一,用2楼的方法查出来却是第一周周一。
    不过,对你这个方法不太懂,能否讲解一下?我数据库不熟,特别是这些函数。我看书上说TRUNC(x,y)用来截取,可你这个写法就不懂了。似懂非懂,
    其实我现在又遇到了另一个问题,就是在对某一天进行统计的时候,用一条sql语句查询不出来所有的列。
    我是通过日期为分组来统计的,如:select statdate,max(sendqtysum)sendqtysum from  s_send_qty_stat group by statdate;但是这张表还有其他的字段,campaignid,taskid,prmtid,我想把这些字段也展示出来,却不知道改怎么写。 总共需要展示的列是campaignid,taskid,prmtid,statdate,sendqtysum .通过表连接也不行,你可否给看下?
    其实我不知道我的理解是不是正确。我的理解是你需要查询出在statdate这一天sendqtysum最大的一条记录的信息。
    如果理解正确我觉得可以这样写:
    select t1.statdate,t1.sendqtysum, campaignid,taskid,prmtid s_send_qty_stat t1,(select statdate,max(sendqtysum)sendqtysum from s_send_qty_stat group by statdate) t2 where t1.statdate=t2.statdate and t1.sendqtysum=t2.sendqtysum;
    你说通过表连接不行是什么意思?
      

  11.   

    你这个sql语句计算2013-11-25,得出来的结果是 48,而用select to_char(sysdate,'WW day') from dual方法得出来的却是47。
    我在网上查过,直接用#2的方法就有可能出现差一周的情况,你可以测试一下嘛我测了,你这个方法查出来是对的,2楼查出来是有问题的,比如:2013-01-07为第二周周一,用2楼的方法查出来却是第一周周一。
    不过,对你这个方法不太懂,能否讲解一下?我数据库不熟,特别是这些函数。我看书上说TRUNC(x,y)用来截取,可你这个写法就不懂了。似懂非懂,
    其实我现在又遇到了另一个问题,就是在对某一天进行统计的时候,用一条sql语句查询不出来所有的列。
    我是通过日期为分组来统计的,如:select statdate,max(sendqtysum)sendqtysum from  s_send_qty_stat group by statdate;但是这张表还有其他的字段,campaignid,taskid,prmtid,我想把这些字段也展示出来,却不知道改怎么写。 总共需要展示的列是campaignid,taskid,prmtid,statdate,sendqtysum .通过表连接也不行,你可否给看下?
    如果你似懂非懂。其实你可以将里面的子查询拿出来执行,那样你才知道每个函数的作用。
      

  12.   

    你这个sql语句计算2013-11-25,得出来的结果是 48,而用select to_char(sysdate,'WW day') from dual方法得出来的却是47。
    我在网上查过,直接用#2的方法就有可能出现差一周的情况,你可以测试一下嘛我测了,你这个方法查出来是对的,2楼查出来是有问题的,比如:2013-01-07为第二周周一,用2楼的方法查出来却是第一周周一。
    不过,对你这个方法不太懂,能否讲解一下?我数据库不熟,特别是这些函数。我看书上说TRUNC(x,y)用来截取,可你这个写法就不懂了。似懂非懂,
    其实我现在又遇到了另一个问题,就是在对某一天进行统计的时候,用一条sql语句查询不出来所有的列。
    我是通过日期为分组来统计的,如:select statdate,max(sendqtysum)sendqtysum from  s_send_qty_stat group by statdate;但是这张表还有其他的字段,campaignid,taskid,prmtid,我想把这些字段也展示出来,却不知道改怎么写。 总共需要展示的列是campaignid,taskid,prmtid,statdate,sendqtysum .通过表连接也不行,你可否给看下?
    其实我不知道我的理解是不是正确。我的理解是你需要查询出在statdate这一天sendqtysum最大的一条记录的信息。
    如果理解正确我觉得可以这样写:
    select t1.statdate,t1.sendqtysum, campaignid,taskid,prmtid s_send_qty_stat t1,(select statdate,max(sendqtysum)sendqtysum from s_send_qty_stat group by statdate) t2 where t1.statdate=t2.statdate and t1.sendqtysum=t2.sendqtysum;
    你说通过表连接不行是什么意思?其实是查询出来这一天中campaignid,taskid,prmtid这些id都相同的sendqtysum最大值,我想我知道是什么问题了,我表里插入的数据这些id都是不同的,所以才会都查出来吧。
      

  13.   

    你这个sql语句计算2013-11-25,得出来的结果是 48,而用select to_char(sysdate,'WW day') from dual方法得出来的却是47。
    我在网上查过,直接用#2的方法就有可能出现差一周的情况,你可以测试一下嘛我测了,你这个方法查出来是对的,2楼查出来是有问题的,比如:2013-01-07为第二周周一,用2楼的方法查出来却是第一周周一。
    不过,对你这个方法不太懂,能否讲解一下?我数据库不熟,特别是这些函数。我看书上说TRUNC(x,y)用来截取,可你这个写法就不懂了。似懂非懂,
    其实我现在又遇到了另一个问题,就是在对某一天进行统计的时候,用一条sql语句查询不出来所有的列。
    我是通过日期为分组来统计的,如:select statdate,max(sendqtysum)sendqtysum from  s_send_qty_stat group by statdate;但是这张表还有其他的字段,campaignid,taskid,prmtid,我想把这些字段也展示出来,却不知道改怎么写。 总共需要展示的列是campaignid,taskid,prmtid,statdate,sendqtysum .通过表连接也不行,你可否给看下?
    其实我不知道我的理解是不是正确。我的理解是你需要查询出在statdate这一天sendqtysum最大的一条记录的信息。
    如果理解正确我觉得可以这样写:
    select t1.statdate,t1.sendqtysum, campaignid,taskid,prmtid s_send_qty_stat t1,(select statdate,max(sendqtysum)sendqtysum from s_send_qty_stat group by statdate) t2 where t1.statdate=t2.statdate and t1.sendqtysum=t2.sendqtysum;
    你说通过表连接不行是什么意思?其实是查询出来这一天中campaignid,taskid,prmtid这些id都相同的sendqtysum最大值,我想我知道是什么问题了,我表里插入的数据这些id都是不同的,所以才会都查出来吧。
    对啊,如果ID都是不同的,每个不同的都是一组,只有campaignid,taskid,prmtid三个字段都相同的记录才会被整合成一条记录(取sendqtysum最大的一条)
      

  14.   


    根据你这个语句怎么来写周视图呢?现在这个表里是记录的数据是按天来记录的,而且一天里可以有多条数据。group by后面不可以有子查询,一条sql语句能写出来吗?
      

  15.   


    根据你这个语句怎么来写周视图呢?现在这个表里是记录的数据是按天来记录的,而且一天里可以有多条数据。group by后面不可以有子查询,一条sql语句能写出来吗?
    你用startdate将TO_DATE('20091231', 'YYYYMMDD') 替换掉就能求出每个startdate所对应的周数,就算一天有多条数据,但是他们对应的周数是一样的,然后你再GROUP BY周数就OK了
      

  16.   


    根据你这个语句怎么来写周视图呢?现在这个表里是记录的数据是按天来记录的,而且一天里可以有多条数据。group by后面不可以有子查询,一条sql语句能写出来吗?
    你用startdate将TO_DATE('20091231', 'YYYYMMDD') 替换掉就能求出每个startdate所对应的周数,就算一天有多条数据,但是他们对应的周数是一样的,然后你再GROUP BY周数就OK了都已经写出来了,多谢啦!