Cominciamo pensando all'SQL, non a Magento (ci arriveremo più avanti). Lo scriverei come tale (ignorando i fusi orari per semplicità):
SELECT sku,SUM(qty_ordered) FROM sales_flat_order_item
WHERE created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()
GROUP BY sku
Quella query funziona (ho testato). Quindi, come potremmo scrivere questa query in Magento?
- In primo luogo, vediamo che è interamente basato su
sales_flat_order_item
- Magento ha una raccolta di risorse speciali per questa tabella; possiamo farne uso.
- Vediamo che usa a
SUM
in una delle colonne
WHERE
ha una BETWEEN
clausola - probabilmente possiamo usare Zend_Db_Expr
per produrre il nostro periodo di tempo personalizzato di 2 settimane di rolling.
- Infine, ha un
GROUP
Vediamo se non riusciamo a metterlo insieme, quindi, con una breve chiamata a reset
per assicurarci di ottenere solo le colonne che definiamo e nient'altro:
$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'));
Una semplice eco di $query->getSelect()
ci mostra che la query è formattata abbastanza bene:
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`
Altre considerazioni:
In futuro potresti voler filtrare questo rapporto in base allo stato dell'ordine (unirti a un'altra tabella) o potresti assicurarti che i fusi orari siano accurati (in questo momento è il rapporto basato su GMT).
Partecipare è semplice:
->join(array('e' => 'sales_flat_order'),'main_table.order_id = e.entity_id')
Ma l'aggiunta di fusi orari può diventare complicata. Cerca Mage_Core_Model_Date
alcuni metodi che convertano i timestamp da e verso GMT. Guarda anche nella raccolta dei rapporti sulle vendite.
Spero che aiuti! Buona fortuna.