sql關於連續日期的統計報表問題

OmarChina發表於2007-05-20
這是另一個個關於連續日期的統計報表問題~~
客戶編號 物品名稱 訂購日期 數量 單價
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

QUESTION:可否利用一條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
[@more@]
answer:
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');


t

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9925929/viewspace-915614/,如需轉載,請註明出處,否則將追究法律責任。

相關文章