繁体   English   中英

MySQL过程-开始工作

[英]MySQL procedure - Getting to work

这是我编写的程序,用于找出每个客户每天购买的前10件商品。

这是我尝试过的第一次PL / SQL操作,它没有实现我期望的功能。

我使用的逻辑是接受每个客户对我感兴趣的开始日期,结束日期和最高的“ 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

实际上,您根本不需要存储过程。 相反,您可以使用一个使用user-defined variables的单个select语句?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM