พบกับบทความเกี่ยวกับคอมพิวเตอร์และ programming ได้ที่ http://articles.modoeye.com | บล็อกอาหาร
PHP development / ถามเรื่องการทำรายงานยอดขาย
KB
KB
Wed 23 Jan 2008 23:35:34

คือมันจะต้องคำนวนยอดขายรวมเป็นสัปดาห์ เดือน ปี  นะครับ ต้องเขียนโค้ด sql ลักษณะไหนหรือครับ ผมเก็บเวลาเป็นประเภท datetime นะครับ

แล้วถ้าต้องการให้รายงานวันที่เท่านี้ ถึงวันที่เท่านี้จะให้มันคำนวนวันที่อย่างไรครับ

KB
KB
Thu 7 Feb 2008 23:50:15

คือผมลองใช่โค้ดแบบนี้ดูอะครับ

$sql = "SELECT SUM(SalePrice) FROM order_detail  where SaleTime  like '%$year-01%' GROUP BY SaleTime like '%$year-01%';";

มันแสดงรายงานออกมาได้ แต่จริงๆ แล้วตรง 01 คือเดือน 1 ผมต้องการใส่ตัวแปรที่รับค่ามาอีกหน้านึง แต่พอผมใช้โค้ด แบบนี้แล้วมันไม่ผ่านอะครับ $sql = "SELECT SUM(SalePrice) FROM order_detail  where SaleTime  like '%$year-$month%' GROUP BY SaleTime like '%$year-$month%';"; ต้องแก้ยังไงหรอครับ

webmaster
webmaster
Fri 8 Feb 2008 14:04:00
ขออภัยด้วยนะครับไม่เห็นกระทู้นี้ เป็นเดือนมาแล้ว -_-!

ถ้าคุณเก็บข้อมูลเป็น date, datetime, timestamp จะสามารถใช้ datetime function ได้เลยครับ เช่นในกรณีนี้ถ้าอยากได้ปีและเดือน ก็อาจจะใช้ WHERE YEAR(SaleTime)=2008 AND MONTH(SaleTime)=1 ส่วน GROUP BY ก็สามารถใช้ function ต่างๆนี้ได้เช่นกันครับ

ใน GROUP BY ไม่มีการใช้ conparison นะครับดังนั้นการใส่ like หรือ = จึงไม่สามารถทำได้
KB
KB
Fri 8 Feb 2008 14:31:56

ผมพึ่งแก้ได้เมื่อกี้เลย คือตัวแปร $month มันดันส่งค่า 1 ไม่ใช่ 01 เลยไม่ได้ซักที แต่ของคุณมากครับที่แนะนำตรง where กับ group by งั้นผมก็ทำแบบนี้ได้ใช่ปะครับ WHERE YEAR(SaleTime)=$year AND MONTH(SaleTime)=$month 

แต่มีอีกปัญหานึงครับ ต้องการรวมยอดขายเป็นสัปดาห์ มันมีวันที่ 01 ถึง 07 แต่นี้จะโค้ด sql ยังไงอะครับให้ ถ้าเป็นเดือนที่ 1 มันเลือกตัวแปร 01 ได้ แต่ว่าาเลือกสัปดาห์ที่ 1 จะให้มันรู้ไงว่าเราจะเอาตัวแปรวัน 01 ถึง 07 แล้วเอาค่ามารวมกัน

webmaster
webmaster
Fri 8 Feb 2008 20:08:10
1. ใช่ครับ ถ้าเก็บแบบ datetime แล้วก็ควรใช้ built-in function ให้เป็นประโยชน์ครับ ซึ่งสามารถทำงานได้เร็วการแปลงไปเป็น string แล้วทำการเปรียบเทียบอีกที

2. การรวมผลเป็นรายสัปดาห์ก็สามารถใช้ function ได้ครับ เช่น SELECT SUM(....), WEEKOFYEAR(SaleTime) AS woy FROM.... WHERE ..... GROUP BY woy จะได้รายการรวมเป็นรายสัปดาห์ประมาณ 52-53 record แล้วก็มาเลือกเอาข้อมูลช่วงที่ต้องการอีกทีครับ
KB
KB
Mon 11 Feb 2008 13:11:19

ถ้าเป็นวันนี่ใช้ยังไงครับ ผมลองไม่ถูกซักตัว date() หรือ day() หรือ mday() วันที่ที่เป็นตัวเลขนะครับ เช่น 01, 02, 03

webmaster
webmaster
Mon 11 Feb 2008 17:11:05
การใช้ function ใน MySQL ส่วนใหญ่จะต้องมีการผ่านค่า parameter เข้าไปด้วยครับ ถ้าต้องการหาค่าวันปัจจุบัน สามารถทำได้เช่น
DAY(NOW()), DAYOFMONTH(NOW())
หรือถ้าต้อง leading zero ด้วยต้องใช้
DATE_FORMAT('%d', NOW())
KB
KB
Tue 12 Feb 2008 01:16:11

ไม่ใช่ครับ คือจะเอาตัวแปลที่รับค่ามาใส่ใน WHERE YEAR(SaleTime)=$year AND MONTH(SaleTime)=$month ลักษณะนี้นะครับ แต่ว่าตรงวันทีมันไม่ได้ซักทีครับ ลอง date(SaleTime) day(SaleTime) mady(SaleTime) ก็ไม่ถูกอะครับ

webmaster
webmaster
Tue 12 Feb 2008 14:03:14
ถ้าจะหาค่าวันที่ของ field SaleTime ก็ใช้ DAY(SaleTime) ได้เลยครับ หรือ DAYOFMONTH(SaleTime) ถ้าต้องการ leading zero ก็ DATE_FORMAT('%d', SaleTime)
KB
KB
Tue 12 Feb 2008 17:43:38

ตกลงผมใช่ DAY() ครับ ตอนแรกไม่รู้ทำไมทำเท่าไหร่ก็ error แต่ลองทำใหม่แต่แรก ตอนนนี้ได้แล้วครับ ของคุณครับ

KB
KB
Wed 13 Feb 2008 19:05:21

แล้วถ้าต้องการหา Product ที่วันสินค้าเข้าน้อยกว่าวันปัจจุบัน 3 เดือน แบบนี้ต้องเขียนโค้ดตรงเวลาแบบไหนครับ

webmaster
webmaster
Thu 14 Feb 2008 02:25:00
ต้องคิดเป็นตรรกะก่อนครับ เช่นตามต้องการนั้น จะได้ว่า เราต้องการข้อมูลตั้งแต่เมื่อ 90 วันก่อน (โดยประมาณ) จนถึงวันปัจจุบัน ก็จะได้
SELECT..... WHERE SaleTime => DATE_SUB(NOW(), INTERVAL 3 MONTH) AND SaleTime <= NOW()

หรืออาจจะใช้
SELECT .... WHERE SaleTime BETWEEN DATE_SUB(NOW(), INTERVAL 3 MONTH) AND NOW()

แต่การใช้ BETWEEN จะมีปัญหาในการ CAST จาก date, datetime, timestamp, time ถ้าข้อมูลไม่เป็นชนิดเดียวกันจริงๆจะต้องทำการ CAST() ให้เป็นชนิดเดียวกันจริงๆ ไม่เช่นนั้นอาจจะเกิดปัญหาในการคำนวนได้ครับ

การใช้ built-in function ของ mysql ต้องอ่าน document ของเขาเยอะๆครับ จะช่วยให้การเขียน query ได้มีประสิทธิภาพมากขึ้น และจะทำให้เราเขียนตาม Syntax ที่ถูกต้องด้วยครับ
KB
KB
Thu 14 Feb 2008 03:45:36

ขออีกนิดครับ คือว่าข้อมูลที่ต้องการคือหลังจาก 90 วันขึ้นไปนะครับ ไม่ใช่ระหว่างวันนี้ถึง90วันหลังจากนี้ ผมลองแล้วลองอีกก็ไม่ได้

webmaster
webmaster
Thu 14 Feb 2008 10:02:32
จากโค๊ดข้างบนนั้นคือหาข้อมูลระหว่างวันที่ 14 Dec 2007 - 14 Feb 2008 ครับ ถ้านอกจากนี้ก็ เปลี่ยนค่าตามต้องการได้เลยครับ
KB
KB
Thu 14 Feb 2008 15:21:33

ได้แล้วครับ ผมงงเองแหละ ขอบคุณมากครับ

Reply
Name:
E-mail:
Home | Services | Forum | Classified | Directories | Support | Contact
ATOM feed RSS 0.9 feed RSS 1.0 feed RSS 2.0 feed
Copyright © 2005 - 2007 Modoeye.com, All Rights Reserved.
Disclaimer | Privacy policy | Term of Use | Term of Services
Valid XHTML Valid CSS! PHP: Hypertext Preprocessor MySQL database Apache Powered! FreeBSD Power to serve
Modoeye Sitemap Client login