将连续日期的资料合并成一笔数据。 关键字:连续日期
首先想一下: 在一大堆日期里,如何取出连续日期(分组)?这是一个技巧。 如下图的日期所示,要如何对这些日期按连续日期分组呢?
1,首先将这些日期排序,并得到行号 ROWNUM 2,按YYYYMMDD格式将日期转换为数值 T1。 3,T1 - ROWNUM,如果是连续的日期,结果一定相同。 4,按结果分组就行了。 如图所示:
应用举例:
客戶編號 物品名稱 訂購日期 數量 單價 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语句:
CREATE TABLE TST1( VEN_CUST VARCHAR2(20), PART VARCHAR2(20), ORDER_DATE DATE, QTY NUMBER, PRICE NUMBER )
BEGIN INSERT INTO TST1 (VEN_CUST,PART,ORDER_DATE,QTY,PRICE) VALUES ('A001','A',TO_DATE('2006/11/01','YYYY/MM/DD'),1,50); INSERT INTO TST1 (VEN_CUST,PART,ORDER_DATE,QTY,PRICE) VALUES ('A001','A',TO_DATE('2006/11/02','YYYY/MM/DD'),2,50); INSERT INTO TST1 (VEN_CUST,PART,ORDER_DATE,QTY,PRICE) VALUES ('A001','A',TO_DATE('2006/11/03','YYYY/MM/DD'),4,50); INSERT INTO TST1 (VEN_CUST,PART,ORDER_DATE,QTY,PRICE) VALUES ('A001','A',TO_DATE('2006/11/05','YYYY/MM/DD'),3,50); INSERT INTO TST1 (VEN_CUST,PART,ORDER_DATE,QTY,PRICE) VALUES ('A001','C',TO_DATE('2006/11/06','YYYY/MM/DD'),2,30); INSERT INTO TST1 (VEN_CUST,PART,ORDER_DATE,QTY,PRICE) VALUES ('A001','C',TO_DATE('2006/11/07','YYYY/MM/DD'),2,30); COMMIT; END;
SELECT B.VEN_CUST,B.PART, MIN(B.ORDER_DATE) AS START_DATE, MAX(B.ORDER_DATE) AS END_DATE, SUM(B.QTY) AS QTY, B.PRICE, SUM(B.QTY * B.PRICE) AS AMT FROM( SELECT A.*, TO_NUMBER(TO_CHAR(A.ORDER_DATE,'YYYYMMDD')) AS T1, ROWNUM AS RN, TO_NUMBER(TO_CHAR(A.ORDER_DATE,'YYYYMMDD')) - ROWNUM AS T2 FROM( SELECT * FROM TST1 ORDER BY VEN_CUST,PART,ORDER_DATE ) A ) B GROUP BY VEN_CUST,PART,T2,PRICE
|