sql统计时间出现断点的相关情况

Question:
有一表,其数据如下:
 时间            数
2006/01/01          xxx.xx
2006/01/02           xxx.xx
2006/01/03          xxx.xx
2006/01/04          xxx.xx
    ..........         ......
统计结果要如下:
   期间             sum数
2006/01/01(星期五)~2006/01/03(星期日)      xxx.xx
2006/01/04(星期一)~2006/01/10(星期日)      xxx.xx
...... ....

[@more@]

Answer:按自然的星期来统计SQL> select * from t;
LOGDATE RN
----------- ----
2006-11-22 1
2006-11-23 2
2006-11-24 3
..........
2006-12-19 28
2006-12-20 29

29 rows selected

SQL>
SQL> SELECT TO_CHAR(TRUNC(MIN(B.LOGDATE)), 'YYYY-MM-DD') || '(' ||
2 TO_CHAR(TRUNC(MIN(B.LOGDATE)), 'Day') || ')~' ||
3 TO_CHAR(TRUNC(MAX(B.LOGDATE)), 'YYYY-MM-DD') || '(' ||
4 TO_CHAR(TRUNC(MAX(B.LOGDATE)), 'Day') || ')' AS weekday,
5 C.TOTAL AS total
6 FROM T B,
7 (SELECT DECODE(TO_CHAR(A.LOGDATE, 'd'),
8 1,
9 TO_CHAR(A.LOGDATE, 'WW') - 1,
10 TO_CHAR(A.LOGDATE, 'WW')) AS WEEKDAY,
11 SUM(A.RN) AS TOTAL
12 FROM T A
13 GROUP BY DECODE(TO_CHAR(A.LOGDATE, 'd'),
14 1,
15 TO_CHAR(A.LOGDATE, 'WW') - 1,
16 TO_CHAR(A.LOGDATE, 'WW'))) C
17 WHERE DECODE(TO_CHAR(B.LOGDATE, 'd'),
18 1,
19 TO_CHAR(B.LOGDATE, 'WW') - 1,
20 TO_CHAR(B.LOGDATE, 'WW')) = C.WEEKDAY
21 GROUP BY C.TOTAL
22 ORDER BY weekday
23 /

WEEKDAY TOTAL
------------------------------------- ----------
2006-11-22(星期三)~2006-11-26(星期日) 15
2006-11-27(星期一)~2006-12-03(星期日) 63
2006-12-04(星期一)~2006-12-10(星期日) 112
2006-12-11(星期一)~2006-12-17(星期日) 161
2006-12-18(星期一)~2006-12-20(星期三) 84

这个方法比较优越:
SELECT * FROM TEST02;
TIME1 NUM1
---------- ----------
23-11月-06 1
24-11月-06 2
25-11月-06 3.........
25-2月 -07 95
26-2月 -07 96
27-2月 -07 97

TIME1 NUM1
---------- ----------
28-2月 -07 98
01-3月 -07 99
02-3月 -07 100
已選取 100 個資料列.
SQL> SELECT TO_CHAR(NEXT_DAY(TIME1, 2), 'YYYY/MM/DD'), SUM(NUM1)
2 FROM TEST02
3 GROUP BY TO_CHAR(NEXT_DAY(TIME1, 2), 'YYYY/MM/DD');

TO_CHAR(NE SUM(NUM1)
---------- ----------
2006/11/27 10
2006/12/04 56
2006/12/11 105
2006/12/18 154
2006/12/25 203
2007/01/01 252
2007/01/08 301
2007/01/15 350
2007/01/22 399
2007/01/29 448
2007/02/05 497
2007/02/12 546
2007/02/19 595
2007/02/26 644
2007/03/05 490
已選取 15 個資料列.

主要是巧妙使用了NEXT_DAY函数。
select to_char(min(time1),'yyyy-mm-dd')||'('||to_char(min(time1),'day')||')'||'~'||to_char(max(time1),'yyyy-mm-dd')||'('||to_char(max(time1),'day')||')',sum(num1) from test02
group by trunc(next_day(time1,2));

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9925929/viewspace-915612/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9925929/viewspace-915612/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值