选择SUM(字段)到达特定点的行ID - MySQL

时间:2012-04-26 15:00:23

标签: mysql sum where

使用“标准”订单表,我试图找出特定客户购买一定数量商品的时间。

Order ID      Items      Client      Date
--------      -----      ------      ----

1             1          Fred        26/04/2012
2             3          John        25/04/2012
3             2          Fred        20/04/2012
4             5          Fred        18/04/2012
5             3          Fred        14/04/2012
6             4          Fred        10/04/2012

所以我想知道弗雷德购买的最后10件物品所涵盖的时间范围,从现在起开始工作。

在这种情况下,我会尝试识别订单ID 1,3,4和& 5加在一起带我到(或刚刚过去)我的目标总共10项,所以我要找的日期是14/04/2012。

这有一个简单的解决方案吗?

3 个答案:

答案 0 :(得分:0)

没有简单的方法,只要你拥有它就可以做到。

如果您要跟踪订购了哪些商品,则可以加入Items表,这样每个商品就有一行。然后你可以选择前10名。

select *
from Orders o
join OrderItems oi on oi.orderId = o.orderId
join Items i on i.itemId = oi.itemId
where o.Client = 'Fred'
order by o.Date
limit 10;

然后语法可能会因您使用的数据库(more info)而异。

答案 1 :(得分:0)

解决此问题的一种方法是计算购买商品的总运行总额:

select 
  orders.*, 
  sum(
    select items 
    from orders as `inner` 
    where client = "Fred" and 
     `outer`.`date` <= `inner`.`date`
  ) as `Running total`
from orders as `outer`
where client = "Fred"
order by date desc;

请注意选择列表中的子查询,该子查询总结了Fred在该日期或之后购买的商品数量。

输出应该是这样的:

Order ID      Items      Client      Date         Running total
--------      -----      ------      ----         -------------

1             1          Fred        26/04/2012     1
3             2          Fred        20/04/2012     3
4             5          Fred        18/04/2012     8
5             3          Fred        14/04/2012     11
6             4          Fred        10/04/2012     15

然后从这个结果中,您可以轻松选择合适的行。

答案 2 :(得分:0)

脱离我的头顶......

CREATE FUNCTION time_of_last(itemcount INT, custid VARCHAR(50))
RETURNS DATE
BEGIN
   DECLARE tally INT DEFAULT 0;
   DECLARE ondate DATE;
   DECLARE curritems IN DEFAULT 0;
   DECLARE cur1 CURSOR FOR SELECT t.items, t.orderdate FROM yourtable t
      WHERE customer=custid ORDER BY orderdate DESC;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET ondate = NULL;

   OPEN cur1;

   read_loop: LOOP
       FETCH cur1 INTO curritems, ondate;
       SET tally = tally+curritems;
       IF (tally>=itemcount) THEN
            LEAVE read_loop;
       END IF;
   END LOOP;

   CLOSE cur1;

   RETURN ondate;
END;

SELECT time_of_last(10, 'Fred');

请注意,如果您想开始收集其他信息,例如套装中的订单,那么Matt Fenwick的解决方案就更清晰了。