2016-08-03 8 views
0

ここでは、顧客1人あたりに購入したトップ10のアイテムを調べるために書いた手順を示します。MySQLの手続き - 作業の流れ

これは私が試行した最初のPL/SQLのことです。これは私が期待していることではありません。

私が使用したロジックは、開始日、終了日を受け入れることです&トップ 'x'の売上高は私が顧客あたりに興味がある。その後、ユニークな顧客テーブルをループするには - cust_table & 1人1日当たりトップ 'x'が見つかります。

この機能を利用するには、ガイダンスをリクエストしてください。

CREATE PROCEDURE `at _the _top`(in stDate date, in edDate date, in lim int) 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE cust TEXT; 
    DECLARE custNames CURSOR FOR SELECT CUSTOMER FROM cust_table; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    OPEN custNames; 

    read_loop: LOOP 
     FETCH custNames INTO cust; 

     IF done THEN 
      LEAVE read_loop; 
     END IF; 

     WHILE(stDate <= edDate) DO 
      #insert into top_cust(EVE_DATE,CUST_NAME,ITEM_ID,ITEMS_PURCHASED) (select EVE_DATE, CUST_NAME, ITEM_ID, SUM(ITEM_BUNDLE_SIZE) as ITEMS_PURCHASED_TOTAL from cust_sales_hist where EVE_DATE = stDate and CUST_NAME = cust group by EVE_DATE, ITEM_ID order by ITEMS_PURCHASED_TOTAL desc limit lim);    
      SELECT concat('Custome - ', cust); 
      SELECT CONCAT('Start Date - ', stDate); 
      SELECT CONCAT('End date - ', edDate); 
      SELECT CONCAT('Limit - ', lim); 
      SELECT 
       EVE_DATE, 
       CUST_NAME, 
       ITEM_ID, 
       SUM(ITEM_BUNDLE_SIZE) AS ITEMS_PURCHASED_TOTAL 
      FROM 
       cust_sales_hist 
      WHERE 
       EVE_DATE = stDate 
       AND CUST_NAME = cust 
      GROUP BY 
       EVE_DATE , 
       ITEM_ID 
      ORDER BY 
       ITEMS_PURCHASED_TOTAL DESC 
      LIMIT 
       LIM; 
      SET stDate = date_add(stDate, INTERVAL 1 DAY); 
     end WHILE; 
    END LOOP; 

    CLOSE custNames; 
END 
+0

これは、PL/SQLではありません。 PL/SQLは、Oracleデータベースで使用されるプロシージャ言語です。私は、MySQLが独自の手続き型言語のための特定の名前を持っていることを知らない。 – sstan

+0

ニース、そこにいる誰かが、この質問のために指を横切って閉じていることと、また下に投票しています。よくやった。それはわたしを助ける。ありがとうトン – usert4jju7

+0

いいえ。それは、質問が実際にはっきりしていないということだけです。*私がそれが期待していることはありません。*は明確な問題文ではありません。 @sgeddesの答えの中のコメントの長いと長いものは、通常、質問がより多くの情報/詳細(サンプルデータ、望ましい結果、いつも...)を必要としているというサインです。これはあなたの最初のSQLの質問ではないので、あなたは今IMHOによってよく知っておくべきです。 – sstan

答えて

2

実際にはストアドプロシージャはまったく必要ありません。代わりに、を使用してselectという文を1つ使用できますか?

select eve_date, cust_name, item_id, sum(item_bundle_size) sumsize 
from (
    select eve_date, cust_name, item_id, item_bundle_size, 
      @rn := if(@prevDate=eve_date and @prevItem=item_id, @rn + 1, 
        if (@prevDate:=eve_date, 
         if (@prevItem:=item_id, 1, 1) 
         , 1) 
        ) rn 
    from cust_sales_hist cross join 
     (select @rn:=0, @prevDate:=null, @prevItem:=null) t 
    where cust_name = 'Cust 1' and 
    eve_date between '2016-08-01' and '2016-08-02' 
    order by eve_date, item_id 
) t 
where rn <= 2 
group by eve_date, cust_name, item_id 
+0

ありがとうございました。私はこれをgo。私がPHPからこの呼び出しを行う場合は、構文エラーなしで動作します。私はそれを自分で行うつもりですが、PHPから呼び出す際に既知のエラーを知っているかどうかを素早くチェックし、回避する必要があります。 – usert4jju7

+0

@ usert4jju7 - これらの4つの値(顧客、開始日、終了日、および制限)を渡すためにパラメータ化されたクエリを使用したいと思います。そのためのSOの例がたくさんあります。 – sgeddes

+0

ありがとうsgeddes。答えそのものに、私はそれを行った。出力は、1日あたりトップ10と言います。フルセットの一覧が表示されます。私は '@ rn'を変更しようとしました。これは限界ではないですか?私はユーザー変数に慣れていません。この目的を教えてください。 1日あたりの顧客あたりのトップ 'x'アイテムに制限する方法を教えてください。 – usert4jju7