Почнемо з роздумів про 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. Також вивчіть колекцію звітів про продаж.
Сподіваюся, що це допомагає! Удачі.