sql的奇妙

求一查询的写法(急,没人帮我吗?)
有一表,其数据如下:

          时间                         数
        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
...... ....

按自然的星期来统计
SQL> select * from t;

LOGDATE RN
----------- ----
2006-11-22 1
2006-11-23 2
2006-11-24 3
2006-11-25 4
2006-11-26 5
2006-11-27 6
2006-11-28 7
2006-11-29 8
2006-11-30 9
2006-12-01 10
2006-12-02 11
2006-12-03 12
2006-12-04 13
2006-12-05 14
2006-12-06 15
2006-12-07 16
2006-12-08 17
2006-12-09 18
2006-12-10 19
2006-12-11 20

LOGDATE RN
----------- ----
2006-12-12 21
2006-12-13 22
2006-12-14 23
2006-12-15 24
2006-12-16 25
2006-12-17 26
2006-12-18 27
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
26-11月-06 4
27-11月-06 5
28-11月-06 6
29-11月-06 7
30-11月-06 8
01-12月-06 9
02-12月-06 10
03-12月-06 11
04-12月-06 12
05-12月-06 13
06-12月-06 14
07-12月-06 15
08-12月-06 16
09-12月-06 17
10-12月-06 18
11-12月-06 19
12-12月-06 20
13-12月-06 21
14-12月-06 22
15-12月-06 23
16-12月-06 24
17-12月-06 25
18-12月-06 26
19-12月-06 27
20-12月-06 28
21-12月-06 29
22-12月-06 30
23-12月-06 31
24-12月-06 32
25-12月-06 33
26-12月-06 34
27-12月-06 35
28-12月-06 36
29-12月-06 37
30-12月-06 38
31-12月-06 39
01-1月 -07 40
02-1月 -07 41
03-1月 -07 42
04-1月 -07 43
05-1月 -07 44
06-1月 -07 45
07-1月 -07 46
08-1月 -07 47
09-1月 -07 48
10-1月 -07 49
11-1月 -07 50
12-1月 -07 51
13-1月 -07 52
14-1月 -07 53
15-1月 -07 54
16-1月 -07 55
17-1月 -07 56
18-1月 -07 57
19-1月 -07 58
20-1月 -07 59
21-1月 -07 60
22-1月 -07 61
23-1月 -07 62
24-1月 -07 63
25-1月 -07 64
26-1月 -07 65
27-1月 -07 66
28-1月 -07 67
29-1月 -07 68
30-1月 -07 69
31-1月 -07 70
01-2月 -07 71
02-2月 -07 72
03-2月 -07 73
04-2月 -07 74
05-2月 -07 75
06-2月 -07 76
07-2月 -07 77
08-2月 -07 78
09-2月 -07 79
10-2月 -07 80
11-2月 -07 81
12-2月 -07 82
13-2月 -07 83
14-2月 -07 84
15-2月 -07 85
16-2月 -07 86
17-2月 -07 87
18-2月 -07 88
19-2月 -07 89
20-2月 -07 90
21-2月 -07 91
22-2月 -07 92
23-2月 -07 93
24-2月 -07 94
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));
請教一個關於連續日期的統計報表問題~~
客戶編號 物品名稱 訂購日期 數量 單價
A001 A 2006/11/01 1 50
A001 A 2006/11/02 2 50
A001 A 2006/11/03 4 50
A001 A 2006/11/05 3 50
A001 C 2006/11/06 2 30
A001 C 2006/11/07 2 30

*可否利用一條sql語法求得以下結果
附註條件 1.客戶編號、物品名稱必須為相同資料,
2.開始日期與結束日期必須為連續日期,才可將合併為一筆資料

客戶編號 物品名稱 開始日期 結束日期 數量 單價 小計
A001 A 2006/11/01 2006/11/03 7 50 350
A001 A 2006/11/05 2006/11/05 3 50 150
A001 C 2006/11/06 2006/11/07 4 30 120
SQL> SELECT * FROM T;

ID NAME TIME NUM CHR
---------- ---------- ---------- ---------- ----------
A001 A 23-11月-06 2 50
A001 A 24-11月-06 3 50
A001 C 29-11月-06 2 30
A001 A 25-11月-06 5 50
A001 A 27-11月-06 6 50
A001 C 28-11月-06 2 30

已選取 6 個資料列.

SQL> SELECT B.ID, B.NAME, MIN(TO_CHAR(B.TIME, 'YYYY/MM/DD')) STARTDATE,
2 MAX(TO_CHAR(B.TIME, 'YYYY/MM/DD')) END_TIME, SUM(NUM),CHR,SUM(CHR)
3 FROM (SELECT A.*, TO_NUMBER(TO_CHAR(A.TIME, 'YYYYMMDD') - ROWNUM) CC
4 FROM (SELECT * FROM T ORDER BY TIME, NAME) A) B
5 GROUP BY B.NAME, B.CC, B.ID,B.CHR;

ID NAME STARTDATE END_TIME SUM(NUM) CHR SUM(CHR)
---------- ---------- ---------- ---------- ---------- ---------- ----------
A001 A 2006/11/23 2006/11/25 10 50 150
A001 A 2006/11/27 2006/11/27 6 50 50
A001 C 2006/11/28 2006/11/29 4 30 60
另外請教一個問題
我自己試著用別的方法寫了一個語法 ,
但是這個語法無法判斷連續日期的問題耶~~請大家幫我看看,問題出在那裡?

select DISTINCT ID ,NAME
, min(TIME)over(partition by ID ,NAME) STARTDATE
, max(TIME)over(partition by ID ,NAME) END_TIME
, SUM(NUM)over(partition by ID ,NAME) NUM
,CHR
,SUM(NUM)over(partition by ID ,NAME) *CHR "TOTAL"
from TMP_ORDER
SQL> SELECT DISTINCT ID, NAME,
2 MIN(TIME) over(PARTITION BY ID, NAME, TO_NUMBER(TO_CHAR(A.TIME, 'YYYYMMDD') - ROWNUM))
STARTDATE,
3 MAX(TIME) over(PARTITION BY ID, NAME, TO_NUMBER(TO_CHAR(A.TIME, 'YYYYMMDD') - ROWNUM))
END_TIME,
4 SUM(NUM) over(PARTITION BY ID, NAME, TO_NUMBER(TO_CHAR(A.TIME, 'YYYYMMDD') - ROWNUM)) N
UM,
5 CHR,
6 SUM(NUM) over(PARTITION BY ID, NAME, TO_NUMBER(TO_CHAR(A.TIME, 'YYYYMMDD') - ROWNUM)) *
CHR "TOTAL"
7 FROM (SELECT * FROM t ORDER BY TIME) a;

ID NAME STARTDATE END_TIME NUM CHR TOTAL
---------- ---------- ---------- ---------- ---------- ---------- ----------
A001 A 23-11月-06 25-11月-06 10 50 500
A001 A 27-11月-06 27-11月-06 6 50 300
A001 C 28-11月-06 29-11月-06 4 30 120
我又發現了一個問題..
相同ID,NAME,及TIME 會有二筆記錄耶

ID NAME TIME NUM CHR
------------ --------- ------------------ ---------- --------------
A001 A 2006/11/1 5 50.00
A001 A 2006/11/2 2 50.00
A001 A 2006/11/3 3 35.00
A001 A 2006/11/5 1 50.00
A001 B 2006/11/4 1 30.00
A001 B 2006/11/5 2 30.00
A001 B 2006/11/5 5 30.00
A001 C 2006/11/6 15 20.00
A001 C 2006/11/7 2 20.00
A001 C 2006/11/8 3 20.00

請問可以將相同ID,NAME,日期的資料
日期有可能重覆,也有可能是連續的,
請問這樣的問題有辦法可以解決嗎?

ID NAME STARTDATE END_TIME NUM CHR TOTAL
---------- ---------- ---------- ---------- ---------- ---------- ----------
A001 A 2006/11/1 2006/11/2 7 50.00 350
A001 A 2006/11/3 2006/11/3 3 35.00 105
A001 A 2006/11/5 2006/11/5 1 50.00 50
A001 B 2006/11/4 2006/11/5 8 30.00 240
A001 C 2006/11/6 2006/11/8 20 20.00 400
SQL> SELECT DISTINCT ID, NAME,
2 MIN(TIME) over(PARTITION BY ID, NAME, TO_NUMBER(TO_CHAR(A.TIME, 'YYYYMMDD') - ROWNUM))
STARTDATE,
3 MAX(TIME) over(PARTITION BY ID, N ...
7 FROM (SELECT * FROM t ORDER BY TIME) a; ------&gtSELECT ID,NAME,to_char(TIME,'yyyy/mm/dd'),sum(num),chr FROM t GROUP BY ID,NAME,to_char(TIME,'yyyy/mm/dd'),num,chr ORDER BY name,to_char(TIME,'yyyy/mm/dd');
[@more@]t

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

转载于:http://blog.itpub.net/7860240/viewspace-911142/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值