2016-10-12 8 views
0

SQLを書いて、総注文単位が以前の注文よりも一貫して少ない顧客のリストを取得しようとしています。合計数量と同様にn番目の順になど注文が前の注文よりも少ない顧客のリストを取得するためのクエリ

SQLは私がプロシージャを記述する必要があると仮定しています

create table orders (order_id int, customer_id varchar(5), order_date date, product_id varchar(5), quantity int); 

Insert into orders values(01,'C1','2000-01-01','P1',10); 
Insert into orders values(02,'C2','2002-01-01','P2',15); 
Insert into orders values(03,'C3','2002-04-01','P3',17); 
Insert into orders values(04,'C4','2003-04-01','P1',20); 
Insert into orders values(05,'C4','2006-01-01','P2',1); 
Insert into orders values(06,'C1','2006-05-01','P5',7); 

テーブル作成および移入し、第n-1の順に合計数量未満であると、 LOOPはOrder_idのシリアル番号に基づいています。いったんループすると、order_idに対応するproduct_idと量Qを選択する必要があります。次に、同じorder_idにQより小さい他の数量Q1があるかどうかを確認します。そうであれば、customer_idを印刷します。 そうでない場合、order_idは次のorder_idに移動します。

数量列をチェックして他の数量があるかどうかを確認する部分を実装する方法がわからないQ1 < Q for order_id?

あなたはORDER_DATEに基づいて、各CUSTOMER_IDごとrow_numbersを計算する必要があります

+0

どのように出力は次のようになりますか? –

+0

OUTPUTが顧客リストになります。 C1 C4 C1の場合は前回の注文(7 <10)以下の注文があるため – user1940212

+0

お客様の最後と2番目の最後の注文のみを見たいですか?または、以前の注文よりも少なかった注文があった顧客を一般的に探していますか? (後者は簡単な 'EXISTS'節で実現できます) –

答えて

1

を明確にしてください。次に、n番目の行を各顧客のn-1番目の行に追加し、その数が前の注文よりも少なくても少なくとも1つの注文を持っているかどうかを確認する必要があります。

SQL Fiddle

select t1.customer_id 
from (select o.*, 
     @rn:=if(@previous=customer_id,@rn,0) + 1 as rownum, 
     @previous:=customer_id 
     from orders o, (select @rn:=0,@previous:=NULL) t 
     order by customer_id,order_date) t1 
join (select o.*, 
     @rn:=if(@previous=customer_id,@rn,0) + 1 as rownum, 
     @previous:=customer_id 
     from orders o 
     order by customer_id,order_date) t2 
on t1.customer_id=t2.customer_id and t1.rownum=t2.rownum-1 
group by t1.customer_id 
having count(case when t2.quantity < t1.quantity then 1 end) >= 1 
1

一つの方法は、相関副問合せを使用しています。私は、単純な自体に参加すると信じて

select o.* 
from (select o.*, 
      (select o2.quantity 
       from orders o2 
       where o2.customer_id = o.customer_id and 
        o2.product_id = o.product_id and 
        o2.order_id < o.order_id 
       order by o2.order_id desc 
       limit 1 
      ) prev_quantity 
     from orders o 
    ) o 
where o.prev_quantity > o.quantity; 
+0

動作しません。私はcustomeridとしてcustomeridを更新しようとしました。レコードが提供されているかどうかを確認するための他の更新は試みましたが、まだ失敗します。 – user1940212

+0

@ user1940212 。 。どのように "動作しません"?それは非常に曖昧です。 –

0

はへの正しい行を識別するために埋め込まれたクエリと一緒に、あなたのためにこれを行うことができます日付に基づいて参加してください。

SELECT o1.customer_id, o2.order_date, o1.quantity - o2.quantity AS quantity_less 
FROM orders o1 
INNER JOIN orders o2 ON o2.customer_id = o1.customer_id AND 
         o2.order_date = (SELECT MIN(order_date) FROM orders 
             WHERE order_date > o1.order_date AND customer_id = o1.customer_id) 
WHERE o2.quantity < o1.quantity 
-1
SELECT Customer_ID 
FROM 
(
SELECT c.customer_id,c.order_date,c.quantity,p.quantity AS PreviousQuantity FROM orders c left join orders p ON c.customer_id = p.customer_id AND c.order_date> p.order_date 
WHERE c.quantity< p.quantity AND c.order_date>p.order_date 
)A 
EXCEPT 
SELECT Customer_ID 
FROM 
(
SELECT c.customer_id,c.order_date,c.quantity,p.quantity AS PreviousQuantity FROM orders c left join orders p ON c.customer_id = p.customer_id AND c.order_date> p.order_date 
WHERE c.quantity> p.quantity AND c.order_date>p.order_date 
)B 
関連する問題