 |
ขอคำปรึกษาการแสดงค่าหลายชั้นของ SQL หน่อยครับ ในคิดคำนวณ |
|
 |
|
|
 |
 |
|
ตาราง warranty_items เกี่ยวข้องยังไงครับ แล้ว แต่จะตารางมี field ใดที่สัมพันธ์กันบ้างครับ
ข้อมูลน้อยไปหน่อยครับ
|
 |
 |
 |
 |
Date :
2015-11-10 12:55:49 |
By :
NewbiePHP |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
จุดที่เชื่อมโยงหากัน
users.id_user = warranty_members.user_id
warranty_members.id_members = warranty_product.member_id
warranty_product.serial = warranty_serials.serial
warranty_product.warranty_no = warranty_serials.warranty_no
warranty_serials.item_code = warranty_items.item_code
|
ประวัติการแก้ไข 2015-11-10 13:03:34
 |
 |
 |
 |
Date :
2015-11-10 13:02:02 |
By :
suparuark |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อ่านแล้วยังงงอยู่ ลองดูไม่รู้จะตรงความต้องการไหม
Code (SQL)
select
us.username as USERNAME,
us.email as EMAIL,
wm.name as NAME,
count( wp.id ) as PRODUCT,
sum(coalesce(wi.rrp, 0)) sum_rrp
from users us,
left join warranty_members wm
on us.id = wm.user_id
left warranty_product wp
on wm.id_members = wp.member_id
left join warranty_serials ws
on wp.serial = ws.serial and wp.warranty_no = ws.warranty_no
left join warranty_items wi on ws.item_code = wi.item_code
group by wm.user_id
order by product desc
|
 |
 |
 |
 |
Date :
2015-11-10 14:35:34 |
By :
NewbiePHP |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมนำมาดัดแปลงเล็กน้อยจะได้รูปแบบที่ใช้งานได้
Change
select
us.username,
us.email,
wm.name,
count(wr.id) as product,
sum(coalesce(wi.rrp, 0)) as sum_rrp
from users us
left join warranty_members wm on us.id_user=wm.user_id
left join warranty_product wp on wm.id_member=wp.member_id
left join warranty_serials ws on wp.serial=ws.serial and wp.warranty_no=ws.warranty_no
left join warranty_items wi on ws.item_code=wi.item_code
group by wm.user_id
order by product desc
ค่าที่แสดงผลออกมาถูกต้องครับ ขอนับถืออย่างสูง
แต่อยากรู้เพิ่มเติมเล็กน้อยครับ ถ้าจะสับเปลี่ยนให้กลายเป็น
select
us.username,
us.email,
wm.name,
count(wp.id_register) as product,
sum(coalesce(wi.rrp, 0)) as sum_rrp
from users us, warranty_members wm, warranty_product wp, warranty_serials ws, warranty_items wi
where us.id_user=wm.user_id
and wm.id_member=wp.member_id
and wp.serial=ws.serial
and wp.warranty_no=ws.warranty_no
and ws.item_code=wi.item_code
group by wm.user_id
order by product desc
ค่าแสดงผลออกมาจะไม่เหมือนกันเลย ยกตัวอย่าง
แบบที่ คุณ NewbieXYZ แนะนำ
username email name product sum_rrp
687549w [email protected] Sime 1366 153860.16
แบบ ธรรมดาที่ผมทดลองดู
username email name product sum_rrp
687549w [email protected] Sime 145 153860.16
ที่ต่างกันคือ product
ขอความรู้เพิ่มเติมนิดนึงนะครับ
ขอบคุณครับ
|
 |
 |
 |
 |
Date :
2015-11-10 16:19:40 |
By :
suparuark |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
รูปแบบที่ ทำ เป็นลักษณะ inner join ครับ ต้องมีfield อ้างอิง ที่เหมือนกัน ทุกตารางครับ ถึงจะแสดง record ออกมา
แต่ที่ผมทำเป็น left join ใช้ตารางด้านซ้ายเป็นตารางหลัก ตารางขวามือจะมีหรือไม่มีก็ได้ ครับ
คำสั่ง coalesce จะทำการตรวจสอบ field ว่าเป็น Null หรือ ไม่ถ้าเป็น null ให้ใช้ค่าถัดไป ครับ
เอามาใช้ ตรวจสอบ field rrp ของ warranty_item ว่ามีอยู่หรือไม่ ถ้าไม่มี ให้ใช้ค่า 0 ครับ
ถ้ามีค่าแสดงว่า warranty_serial ตรงกับ warranty_product และตรงกับ warranty_item ทำให้ rrp มีค่าไปด้วย
ข้อเสียของ left join คือช้ากว่า inner join แต่ถ้าตรงตามวัตถุประสงค์ ก็ย่อมถูกต้องครับ
และการ count product ก็ไม่น่าใช้ได้ ครับ น่าจะมีการตรวจสอบก่อนครับ
น่าจะเป็น
sum (wi.rrp<>null) as PRODUCT
|
ประวัติการแก้ไข 2015-11-10 16:56:41 2015-11-10 16:58:29
 |
 |
 |
 |
Date :
2015-11-10 16:55:18 |
By :
NewbiePHP |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณมากครับ ที่แนะนำ
เผอิญตรวจสอบอีกรอบนึงยังมีการผิดอยู่บ้างครับ
เพราะเช็คดูแล้ว มีบาง username มี rrp อยู่ 1 ค่า แต่ค่าที่แสดงยังเป็น 0 อยู่เลยครับ
Username: adyfaa
Name: NOR FADILAH
Email: [email protected]


|
 |
 |
 |
 |
Date :
2015-11-10 17:50:55 |
By :
suparuark |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แล้วใช้คิวรี่แบบไหนครับ
|
 |
 |
 |
 |
Date :
2015-11-10 18:21:48 |
By :
NewbiePHP |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แบบเดียวกะที่ คุณ NewbieXYZ แนะนำมาเลยครับ
|
 |
 |
 |
 |
Date :
2015-11-11 08:52:21 |
By :
suparuark |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณ คุณ NewbieXYZ มากครับ ที่ให้ความรู้เจาะจงเฉพาะ Table และการซ้อนคำสั่งในชุดเดียวกัน
สรุปการหาค่า RRP ได้แล้วครับ
รวมสมาชิกทั้งหมด
select
us.username,
us.email,
wm.name,
count(distinct wr.id) as product,
sum(if(wr.serial_no=ws.serial_no, wi.rrp, 0)) as sum_rrp
from users us
left join warranty_members wm
on us.id=wm.user_id
left join warranty_product_registrations wr
on wm.id=wr.warranty_member_id
left join warranty_serials ws
on wr.serial_no=ws.serial_no
and wr.warranty_no=ws.warranty_no
left join warranty_items wi
on ws.item_code=wi.item_code
where us.email is not null
and us.email <> ''
and wm.name is not null
and wm.name <> ''
group by wm.user_id
order by product desc

รายละเอียดของแต่ละสมาชิก
select
wr.product_category_name,
wr.model,
wr.serial_no,
wr.warranty_no,
if(wr.serial_no=ws.serial_no, wi.rrp, 0) as rrp
from users us
left join warranty_members wm
on us.id=wm.user_id
left join warranty_product_registrations wr
on wm.id=wr.warranty_member_id
left join warranty_serials ws
on wr.serial_no=ws.serial_no
and wr.warranty_no=ws.warranty_no
left join warranty_items wi
on ws.item_code=wi.item_code
where wm.user_id='381607'
group by wr.id

|
ประวัติการแก้ไข 2015-11-11 11:19:35
 |
 |
 |
 |
Date :
2015-11-11 11:15:16 |
By :
suparuark |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|