2016-08-03 78 views
0

下面是我寫的一個程序,用於找出每位客戶每天購買的前10個項目。MySQL程序 - 開始工作

這是我嘗試過的第一個PL/SQL的東西,它沒有做我期待它做的事情。

我使用的邏輯是接受開始日期,結束日期&我對每位客戶感興趣的top'x'銷售額。然後循環訪問唯一客戶表 - cust_table &找到每位客戶每天的最高'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問題,所以你現在應該知道更好的恕我直言。 – sstan

回答

2

根本不需要存儲過程。相反,你可以使用一個select語句使用user-defined variables

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

謝謝Sgeddes。我會給這個去。如果我要從PHP進行這個調用,這個工作沒有語法錯誤。我會自己給它一個,但想到如果你知道從PHP調用它時發現一個已知的錯誤並需要解決,請快速檢查它。 – usert4jju7

+0

@ usert4jju7 - 您將要使用參數化查詢來傳遞這4個值(客戶,開始日期,結束日期和限制) - 我對上面的示例進行了硬編碼。很多關於SO的例子。 – sgeddes

+0

謝謝sgeddes。對於答案本身,我確實給了它一個答案。輸出不限於每天排名前10位。它繼續列出整套。我試着改變'@ rn'。這不是限制嗎?我不熟悉用戶變量。請你能告訴我這個的目的嗎?如何限制每個客戶每天最好的'x'項目請。 – usert4jju7