2013-01-16 4 views
0

고객 테이블의 열, 첫 번째 주문 날짜 및 마지막 날짜의 모든 데이터를 고객 테이블과 주문 테이블 간의 1 : N 관계로 나열해야합니다. Oracle 10g를 사용하고 있습니다.Oracle SQL의 마지막 주문 항목

어떻게 할 수 있습니까?

 
TABLE CUSTOMER 
--------------- 
id    NUMBER 
name   VARCHAR2(200) 
subscribe_date DATE 


TABLE ORDER 
--------------- 
id    NUMBER 
id_order  NUMBER 
purchase_date DATE 
purchase_value NUMBER 
+0

테이블은 어떻게 관련되어 있습니까? 'order'의'id' 테이블은'customer'의'id'와 관련이 있습니까? – Taryn

답변

0

필드 이름으로 혼란 스럽지만 ORDER.id가 CUSTOMER 테이블의 ID라고 가정합니다.

가장 빠른 주문 날짜는 쉽습니다.

마지막 주문 데이터를 가져 오려면 ORDER 테이블에 다시 가입하십시오. 여기

select CUSTOMER.*, min(ORD_FIRST.purchase_date), ORD_LAST.* 
from CUSTOMER 
    inner join ORDER ORD_FIRST on CUSTOMER.id = ORD_FIRST.id 
    inner join ORDER ORD_LAST on CUSTOMER.id = ORD_LAST.id 
group by CUSTOMER.*, ORD_LAST.* 
having ORD_LAST.purchase_date = max(ORD_FIRST.purchase_date) 
1

row_number 기능, 하나의 조인을 사용하여, 그것을하는 방법 중 하나입니다, 그리고 집계에 :

select c.*, 
     min(o.purchase_date) as FirstPurchaseDate, 
     min(case when seqnum = 1 then o.id_order end) as Last_IdOrder, 
     min(case when seqnum = 1 then o.purchase_date end) as Last_PurchaseDate, 
     min(case when seqnum = 1 then o.purchase_value end) as Last_PurchaseValue 
from Customer c join 
    (select o.*, 
      row_number() over (partition by o.id order by purchase_date desc) as seqnum 
     from orders o 
    ) o 
    on c.customer_id = o.order_id 
group by c.customer_id, c.name, c.subscribe_date 
1

그것은 orders 테이블에 customer 테이블을 조인하는 방법을 분명 아니다 (order입니다 오라클의 예약어이므로 테이블의 이름을 order으로 지정할 수 없습니다. 우리가 ordersid_ordercustomer

SELECT c.id customer_id, 
     c.name name, 
     c.subscribe_date, 
     o.first_purchase_date, 
     o.id last_order_id, 
     o.purchase_date last_order_purchase_date, 
     o.purchase_value last_order_purchase_value 
    FROM customer c 
     JOIN (SELECT o.*, 
        min(o.purchase_date) over (partition by id_order) first_purchase_date, 
        rank() over (partition by id_order order by purchase_date desc) rnk 
       FROM orders o) o ON (c.id = o.id_order) 
WHERE rnk = 1 
0

id에 참여한다고 가정하면 아마도 이것이 Order 테이블의 ID 필드를 가정 같은 실제로 Customer ID입니다 :

SELECT C.*, O1.*, O2.purchase_Date as FirstPurchaseDate 
FROM Customer C 
LEFT JOIN 
(
    SELECT Max(purchase_date) as pdate, id 
    FROM Orders 
    GROUP BY id 
) MaxPurchaseOrder 
    ON C.Id = MaxPurchaseOrder.Id 
LEFT JOIN Orders O1 
    ON MaxPurchaseOrder.pdate = O1.purchase_date 
    AND MaxPurchaseOrder.id = O1.id 
LEFT JOIN 
(
    SELECT Min(purchase_date) as pdate, id 
    FROM Orders 
    GROUP BY id 
) MinPurchaseOrder 
    ON C.Id = MinPurchaseOrder.Id 
LEFT JOIN Orders O2 
    ON MinPurchaseOrder.pdate = O2.purchase_date 
    AND MinPurchaseOrder.id = O2.id 

그리고 sql fiddle.