2013-02-24 3 views
1

я погуглить в течение нескольких часов ... думал, что это будет легко, но явно не для меня :)SQL отчет о продажах по календарной неделе

Я получил данные о продажах в двух таблицах и я хочу для генерации еженедельного отчета о продажах для определенного товара. Для этой цели меня не интересуют долларовые ценности, просто количество единиц. «Неделя» - это либо календарная неделя (какой бы ни был начальный день, мне все равно), либо только 7-дневные куски назад от текущей (так что неделя 1 - последние 7 дней, неделя 2 - 8-15 дней назад и т. Д.) - в зависимости от того, что проще. Я просто пытаюсь контролировать тенденции продаж с течением времени. Предпочтительно, чтобы это продолжалось в течение многих лет, так что, если в первую неделю января, например, оно не показало бы только одну запись.

Данные взяты из ZenCart. Структура соответствующих таблиц/столбцов здесь:

Table "orders" has columns: orders_id, date_purchased 

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

Где у меня возникают проблемы есть с стыки и синтаксис.

+0

Много людей используют http://sqlfiddle.com/ размещать проблемы структуры данных. –

+0

Не могли бы вы показать нам свои таблицы с образцом и ожидаемыми данными? :) – aspiring

+0

Знаешь, я понимаю его гораздо более простую структуру, чем я думал. Возможно, таблицы действительно не нужны. Я отредактировал вопрос. – bcsteeve

ответ

2

Это работает для моих потребностей:

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 
+0

+1 Я давно не был. Замечательно видеть, что вы сами это поняли. Так держать! –

0

Если у вас есть date/datetime/timestamp колонки, вы можете использовать функцию 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 для тестирования.

+0

Спасибо. Мне нужно немного больше рук, чем это. Я понятия не имею, как обернуться вокруг недели. Кроме того, я хотел бы, чтобы он отображал все данные в таблице результатов ... не один запрос за результат. Это возможно? «Группу по« сделке »? – bcsteeve

Смежные вопросы