Find avarage value in MySQL
2010/07/08 Leave a comment
ปัญหาการใช้ mysql aggregate functions อัพเดทข้อมูลด้วยค่าที่คำนวณได้จากตารางเดิม
ปัญหาการใช้ mysql aggregate functions อัพเดทข้อมูลด้วยค่าที่คำนวณได้จากตารางเดิม
นอกจาก mysql อยากรู้ว่าฐานข้อมูลใดสามารถทำสิ่งต่อไปนี้ได้บ้างครับ หรือต้องไปคอนฟิกอะไรใน mysql ให้มันทำได้
mysql ทำได้:
UPDATE tbl_a SET tbl_a.percent_total = tbl_a.value/tbl_a.total
mysql ทำได้ :
UPDATE tbl_a SET tbl_a.percent_total = tbl_a.value/( SELECT SUM( tbl_each_total.total ) FROM tbl_each_total )
mysql ทำไม่ได้ :
UPDATE tbl_a SET tbl_a.percent_total = tbl_a.value/( SELECT SUM( a_temp.value ) FROM tbl_a AS a_temp )
จากทั้ง 3 กรณี ทำให้ผมรู้ว่าการอัพเดทข้อมูลใน column ใดๆ โดยการใช้ mysql aggregate functions คำนวณค่าจากตารางเดิม ไม่สามารถทำได้ถึงแม้จะเอาค่ามาจาก column อื่นมาคำนวณก็ตาม ( ถ้าเป็น column เดิมก็พอจะเข้าใจอยู่ว่ามันจะทำให้เกิด infinite loop )
ตอนนี้ผมใช้วิธีแก้ปัญหาโดยการสร้างตารางอื่นมาเก็บ ข้อมูลการคำนวณแล้วค่อยเอาตารางดังกล่าวมาคำนวณใส่ตารางเดิมอีกที
1. ไม่ทราบว่าฐานข้อมูลอื่นสามารถแก้ปัญหานี้ได้มั้ยครับ จากที่ค้นหาในเน็ตยังหาไม่เจอ ?
2. กำลังลองศึกษา PostgreSQL ว่าสามารถทำได้ ไม่ทราบว่าตัวนี้สามารถแก้ปัญหานี้ได้หรือเปล่าครับ ?
ขอบ คุณทุกท่านที่ให้คำชี้แนะครับ
———————————————————————————————
ผมเข้าใจว่าต้องการทำแบบนี้
tbl_a(grp, val, percent_total)
(1, 10, 0)
(1, 20, 0)
(1, 18, 0)
(2, 30, 0)
(2, 45, 0)
(2, 10, 0)
…
จากข้อมูลตัวอย่าง แต่และ grp ต้องการค่า percent_total
grp 1 มี 3 แถวจะได้ค่า
1: percent_total = 10/(10+20+18)
2: percent_total = 20/(10+20+18)
3: percent_total = 18/(10+20+18)
ถ้าต้องการแบบนี้ สามารถทำได้โดยการ join
UPDATE tbl_a a
JOIN (SELECT grp, SUM(val) sum_val FROM tbl_a GROUP BY grp) b ON a.grp=b.grp
SET a.percent_total = a.val / b.sum_val;
แต่ ถ้าที่ผมพูดมาทั้งหมดไม่ใช่ ต้องการแค่ค่า sum เดียวไปหารทุกตัว
ก็ทำแบบ นี้
UPDATE tbl_a a, (SELECT SUM(val) total_val FROM tbl_a) b
SET a.percent_total = b.total_val;
หวังว่าอ่านแล้ว คงไปประยุกต์ต่อได้นะครับ
http://www.pantip.com/tech/developer/topic/DD2919943/DD2919943.html