按日历周的SQL销售报告

时间:2013-02-24 16:40:25

标签: mysql sql zen-cart

我一直在谷歌搜索几个小时...认为这很容易,但显然不适合我:)

我在两个表中有销售数据,我想为特定项目生成每周销售报告。为此,我不关心美元价值,只关心单位数量。一个“周”是一个日历周(无论是开始日,我不在乎)或只是从当前回来的7天块(所以第1周是最后7天,第2周是8 - 15天前等等) ) - 哪个更容易。我只是试图监控销售趋势。优选地,它将跨越多年,例如,如果它在1月的第一周,它将不会仅显示一个记录。

数据来自ZenCart。相关的表/列结构如下:

Table "orders" has columns: orders_id, date_purchased

Table "orders_products" has columns: orders_id, products_id, product_quantity

我遇到麻烦的地方是连接和语法。

3 个答案:

答案 0 :(得分:3)

这符合我的需要:

SELECT o.date_purchased, CONCAT(YEAR(o.date_purchased), LPAD(WEEK(o.date_purchased), 2, '0')) as weekyear, op.products_id, SUM( op.products_quantity )
FROM orders_products op
LEFT JOIN orders o ON op.orders_id = o.orders_id
WHERE op.products_id = 331
GROUP BY weekyear
ORDER BY weekyear

答案 1 :(得分:0)

如果您有一些date/datetime/timestamp列,则可以在where子句中使用week函数

select week(now()) as week, sum(units) as total
from sales
where week(sales_date) = week(now());

或前一周

select week(now()) - 1 as week, sum(units) as total
from sales
where week(sales_date) = week(now()) - 1;

你必须注意从第52/53周到第0/1周的年份。

SQLFiddle进行测试。

答案 2 :(得分:0)

为了照顾年终包裹。例如,week(12/30/2018)=52week(12/31/2018)=52都被视为2018年的第52周。2019年的第一天在星期二开始。您可以编写以下案例说明,将12/30/2018和12/31/2018移至2019年的第一周。这样一来,您将有整整7天的时间进行比较:

case when order_date in ( '2018-12-30', '2018-12-31')
     then 0
     else week(order_date)
end as order_week