Zacznijmy od myślenia o SQL, a nie o Magento (do tego dojdziemy później). Tak bym napisał (ignorując strefy czasowe dla uproszczenia):
SELECT sku,SUM(qty_ordered) FROM sales_flat_order_item
WHERE created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()
GROUP BY sku
To zapytanie działa (przetestowałem). Jak więc moglibyśmy napisać to zapytanie w Magento?
- Po pierwsze, widzimy, że jest całkowicie oparty na
sales_flat_order_item
- Magento ma specjalną kolekcję zasobów dla tej tabeli; możemy z tego skorzystać.
- Widzimy, że używa on
SUM
w jednej z kolumn
WHERE
ma BETWEEN
klauzulę - prawdopodobnie możemy użyć Zend_Db_Expr
do wygenerowania niestandardowego 2-tygodniowego przedziału czasowego.
- Wreszcie ma
GROUP
Zobaczmy, czy nie możemy tego złożyć razem, dzięki szybkiemu wezwaniu, reset
aby upewnić się, że otrzymamy tylko zdefiniowane kolumny i nic więcej:
$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'));
Proste echo $query->getSelect()
pokazuje, że zapytanie jest sformatowane całkiem dobrze:
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`
Inne uwagi:
W przyszłości możesz chcieć filtrować ten raport na podstawie statusu zamówienia (dołączenie do innej tabeli) lub możesz upewnić się, że strefy czasowe są dokładne (obecnie raportowanie oparte jest na GMT).
Dołączenie jest proste:
->join(array('e' => 'sales_flat_order'),'main_table.order_id = e.entity_id')
Ale dodanie stref czasowych może się skomplikować. Poszukaj Mage_Core_Model_Date
metod, które konwertują znaczniki czasu na i z GMT. Zajrzyj również do kolekcji raportów sprzedaży.
Mam nadzieję, że to pomaga! Powodzenia.