logo 西林@生存 - 骑猪闯天下!
将连续日期的资料合并成一笔数据
2006-11-24 10:47:00 By:xling

将连续日期的资料合并成一笔数据。
关键字:连续日期

首先想一下:
在一大堆日期里,如何取出连续日期(分组)?这是一个技巧。
如下图的日期所示,要如何对这些日期按连续日期分组呢?



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



转我的贴,写你的名,是一种可耻的行为!请不要让我BS你!
阅读全文 | 回复(0) | 引用通告 | 编辑

发表评论:

    密码:
    主页:
    标题:
    页面数据正在载入...
<<  < 2007 - 11 >  >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Placard
1,長江後浪推前浪,前浪死在沙灘上!
2,有了钱的男人,才是真正的男人...
3,不要以为把你的小JJ埋进土里,你就rape了整个地球;不要以为把你的小JJ朝向天空,你就rape了整个宇宙!
Logon System
Search
Info about this blog
Others
myDream
bxna 京ICP备05002321号