เริ่มจากคิดเกี่ยวกับ 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
- วีโอไอพีมีการรวบรวมทรัพยากรพิเศษสำหรับตารางนี้ เราสามารถใช้ประโยชน์จากสิ่งนั้นได้
- เราเห็นว่ามันใช้
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 ดูที่คอลเลกชันรายงานการขายด้วย
หวังว่าจะช่วย! ขอให้โชคดี