0

顧客テーブルの列、最初の注文の日付、最後の注文のすべてのデータを、顧客テーブルと注文テーブルの間の1:Nの関係で一覧表示する必要があります。Oracle10gを使用しています。

それを行うための最良の方法は何ですか?

テーブルのお客様
---------------
ID番号
名前VARCHAR2(200)
subscribe_date DATE


テーブルの順序
---------------
ID番号
id_order NUMBER
Purchase_date DATE
Purchase_value NUMBER
4

4 に答える 4

1

row_number関数、1 つの結合、および集計を使用して、これを行う 1 つの方法を次に示します。

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
于 2013-01-16T20:49:20.583 に答える
1

customerテーブルをテーブルに結合する方法は明らかではありませんorders(orderは Oracle の予約語であるため、テーブルに名前を付けることはできませんorder)。id_orderインがインにorders結合すると仮定するidcustomer

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
于 2013-01-16T20:49:44.823 に答える
0

フィールド名に混乱していますが、ORDER.id が CUSTOMER テーブルの ID であると仮定します。

最短ご注文日は簡単です。

select CUSTOMER.*, min(ORDER.purchase_date)
from CUSTOMER
  inner join ORDER on CUSTOMER.id = ORDER.id
group by CUSTOMER.*

最後の注文データを取得するには、これを再度 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)
于 2013-01-16T20:44:57.250 に答える
0

テーブル内のIDフィールドOrderが実際に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フィドル

于 2013-01-16T20:53:52.477 に答える