Давайте начнем с размышлений о SQL, а не о Magento (мы доберемся до него позже). Я бы написал так (игнорируя часовые пояса для простоты):
SELECT sku,SUM(qty_ordered) FROM sales_flat_order_item
WHERE created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()
GROUP BY sku
Этот запрос работает (я проверял). Итак, как мы будем писать этот запрос в Magento?
- Во-первых, мы видим, что он полностью основан на
sales_flat_order_item
- у Magento есть специальная коллекция ресурсов для этой таблицы; мы можем использовать это.
- Мы видим, что он использует
SUM
в одном из столбцов
WHERE
есть BETWEEN
предложение - мы можем, вероятно, использовать Zend_Db_Expr
для вывода нашего пользовательского скользящего 2-недельного периода.
- Наконец, у него есть
GROUP
Давайте посмотрим, если мы не сможем собрать это вместе, тогда с быстрым вызовом, чтобы reset
убедиться, что мы получаем только те столбцы, которые мы определяем, и ничего больше:
$query = Mage::getResourceModel('sales/order_item_collection');
$query->getSelect()->reset(Zend_Db_Select::COLUMNS)
->columns(array('sku','SUM(row_total)'))
->where(new Zend_Db_Expr('created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()'))
->group(array('sku'));
Простое эхо $query->getSelect()
показывает, что запрос отформатирован довольно хорошо:
SELECT `main_table`.`sku`, SUM(qty_ordered) FROM `sales_flat_order_item` AS `main_table` WHERE (created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()) GROUP BY `sku`
Другие соображения:
В будущем вы можете захотеть отфильтровать этот отчет на основе статуса заказа (присоединение к другой таблице) или вы можете убедиться, что часовые пояса точны (сейчас это отчетность на основе GMT).
Присоединиться просто:
->join(array('e' => 'sales_flat_order'),'main_table.order_id = e.entity_id')
Но добавление часовых поясов может стать сложным. Посмотрите на Mage_Core_Model_Date
некоторые методы, которые конвертируют метки времени в и из GMT. Также загляните в коллекцию отчетов о продажах.
Надеюсь, это поможет! Удачи.