0

我需要一些帮助来找出正确的 SQL 语句。

如果有一个具有以下结构的表:id、product_id、units、timestamp

我不想要一个包含每天所有单位的列表。一个产品每天最多有一条记录。所以我的第一次尝试是:

SELECT 
    DATE(timestamp) as day, SUM(units) as overall_units 
FROM 
    tbl 
GROUP BY 
    DATE(timestamp);

通常应该这样做。但有时也有没有产品记录的日子。尽管如此,这些单位仍在仓库中,因此它们应该在计算中。

例如:

我们有 3 种产品。汽车、钢笔和轮子。2012-10-20 的记录:

汽车 => 5 支笔 => 20 个轮子 => 4

2012 年 10 月 21 日的记录 汽车 => 5 个轮子 => 6

我的查询将给出以下结果:

2012-10-20 => 29

2012-10-21 => 11

但我想,如果当天没有产品记录,它应该使用该产品的记录,该记录是最接近时间的。

所以应该是:

2012-10-21 => 31

我希望你能理解我的需要。

4

3 回答 3

1
SELECT 
   MAX (DATE(timestamp) ) as day, SUM(units) as overall_units 
FROM tbl

更新 ::

 SELECT max(day),sum(ou) from  
     (  select DATE(timestamp) as day, SUM(units) as ou 
        FROM tbl 
        GROUP BY   DATE(timestamp);
      )

内部 qry 将返回

2012-10-20 , 29
2012-10-21 , 11

最终查询将返回

 2012-10-21 , 40
于 2012-10-19T09:49:59.337 回答
0

我认为您应该研究该DISTINCT()功能。查询可能类似于:SELECT DISTINCT(product_id), * FROM tbl ORDER BY timestamp DESC;使用 PHP 循环遍历您的结果并累积单位。

于 2012-10-19T09:46:36.423 回答
0
SELECT 
    dd.ddate AS day
  , SUM(t.units) as overall_units 
FROM
        ( SELECT DISTINCT
              product_id
          FROM 
              tbl
        ) AS dp
    CROSS JOIN
        ( SELECT DISTINCT
              DATE(timestamp) AS ddate
          FROM 
              tbl
        ) AS dd
    JOIN 
        tbl AS t
            ON t.id =
                ( SELECT
                      tt.id
                  FROM
                      tbl AS tt
                  WHERE 
                      tt.product_id = dp.product_id
                    AND
                      tt.timestamp < dd.ddate + INTERVAL 1 DAY
                  ORDER BY tt.timestamp DESC
                    LIMIT 1
                ) 
GROUP BY 
    dd.ddate ;
于 2012-10-19T15:19:53.147 回答