我有一个products表和一个sales表,该表记录着给定产品在每个日期售出了多少个项目。当然,并非所有产品每天都有销售。
products
sales
我需要生成一个报告,告诉我产品 连续 几天销售(从最新日期到过去),以及仅在那几天销售了多少物品。
我想告诉您到目前为止我已经尝试了多少方法,但是唯一成功(缓慢,递归)的方法是应用程序内部的解决方案,而不是SQL内部的解决方案,这就是我想要的。
我还浏览了关于SO的几个类似问题,但没有找到一个让我对我真正需要的东西有清晰认识的问题。
我在这里设置了一个SQLFiddle来向您展示我在说什么。在这里,您将看到我能想到的唯一查询,但没有得到我需要的结果。我还在那里添加了注释,以显示查询结果。
我希望这里的人知道如何做到这一点。预先感谢您的任何评论!
弗朗西斯科
http://sqlfiddle.com/#!2/20108/1
这是完成工作的存储过程
CREATE PROCEDURE myProc() BEGIN -- Drop and create the temp table DROP TABLE IF EXISTS reached; CREATE TABLE reached ( sku CHAR(32) PRIMARY KEY, record_date date, nb int, total int) ENGINE=HEAP; -- Initial insert, the starting point is the MAX sales record_date of each product INSERT INTO reached SELECT products.sku, max(sales.record_date), 0, 0 FROM products join sales on sales.sku = products.sku group by products.sku; -- loop until there is no more updated rows iterloop: LOOP -- Update the temptable with the values of the date - 1 row if found update reached join sales on sales.sku=reached.sku and sales.record_date=reached.record_date set reached.record_date = reached.record_date - INTERVAL 1 day, reached.nb=reached.nb+1, reached.total=reached.total + sales.items; -- If no more rows are updated it means we hit the most longest days_sold IF ROW_COUNT() = 0 THEN LEAVE iterloop; END IF; END LOOP iterloop; -- select the results of the temp table SELECT products.sku, products.title, products.price, reached.total as sales, reached.nb as days_sold from reached join products on products.sku=reached.sku; END//
那你只需要做
call myProc()