Hãy bắt đầu với suy nghĩ về SQL, không phải Magento (chúng ta sẽ đến đó sau). Tôi sẽ viết nó như vậy (bỏ qua các múi giờ cho đơn giản):
SELECT sku,SUM(qty_ordered) FROM sales_flat_order_item
WHERE created_at BETWEEN NOW()-INTERVAL 2 WEEK AND NOW()
GROUP BY sku
Truy vấn đó hoạt động (tôi đã thử nghiệm). Vì vậy, làm thế nào chúng ta sẽ viết về truy vấn này trong Magento?
- Đầu tiên, chúng tôi thấy rằng nó hoàn toàn dựa trên
sales_flat_order_item
- Magento có một bộ sưu tập tài nguyên đặc biệt cho bảng này; chúng ta có thể sử dụng điều đó.
- Chúng tôi thấy rằng nó sử dụng một
SUM
trong một trong các cột
WHERE
có một BETWEEN
điều khoản - có lẽ chúng ta có thể sử dụng Zend_Db_Expr
để xuất khung thời gian 2 tuần tùy chỉnh của mình.
- Cuối cùng, nó có một
GROUP
Chúng ta hãy xem liệu chúng ta không thể kết hợp nó lại với nhau, sau đó, bằng một cuộc gọi nhanh reset
để đảm bảo rằng chúng ta chỉ nhận được các cột mà chúng ta xác định và không có gì khác:
$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'));
Một tiếng vang đơn giản $query->getSelect()
cho chúng ta thấy rằng truy vấn được định dạng khá tốt:
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`
Những ý kiến khác:
Trong tương lai, bạn có thể muốn lọc báo cáo này dựa trên trạng thái đơn hàng (tham gia vào bảng khác) hoặc bạn có thể muốn đảm bảo rằng các múi giờ chính xác (ngay bây giờ là báo cáo dựa trên GMT).
Tham gia rất đơn giản:
->join(array('e' => 'sales_flat_order'),'main_table.order_id = e.entity_id')
Nhưng thêm múi giờ có thể trở nên phức tạp. Xem xét Mage_Core_Model_Date
một số phương pháp chuyển đổi dấu thời gian sang và từ GMT. Cũng nhìn vào bộ sưu tập báo cáo bán hàng.
Mong rằng sẽ giúp! May mắn nhất.