Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,037

HOME > PHP > PHP Forum > ขอคำปรึกษาการแสดงค่าหลายชั้นของ SQL หน่อยครับ ในคิดคำนวณ



 

ขอคำปรึกษาการแสดงค่าหลายชั้นของ SQL หน่อยครับ ในคิดคำนวณ

 



Topic : 119824



โพสกระทู้ ( 37 )
บทความ ( 0 )



สถานะออฟไลน์




ใครมีความรู้เกี่ยวกับ SQL ในการแสดงค่ารวม โดยค่าจะมาจาก Table ต่างกัน

USERNAME   EMAIL           NAME   PRODUCT  RRP
381542     [email protected]   Boys   1367     32559.63


ถ้าสมมติว่า ไม่ต้องการค่า RRP จะคิดออกมาในรูปแบบ
select us.username as USERNAME, us.email as EMAIL, wm.name as NAME, count( wp.id ) as PRODUCT
from users us, warranty_members wm, warranty_product wp
where us.id = wm.user_id
and wm.id = wp.warranty_member_id
group by wm.user_id
order by product desc


โดย PRODUCT มาจาก count(wr.id) as PRODUCT

RRP มาจาก
1. serial ของ warranty_serials และ warranty_product ตรงกัน ทำให้ค่า rrp ของ warranty_items แสดง
2. ถ้า warranty_serials ไม่มีค่า serial แต่ warranty_product มีค่า serial ค่า rrp ของ warranty_items จะไม่แสดง ทำให้ rrp มีค่าเท่ากับ 0
3. ข้อ 1. และ 2. จะทำการรวมกันเพื่อแสดงออกมาเป็น RRP

ในการเขียน SQL ต้องแสดงออกมาอย่างไร

ค่า Fields ของ Table
Table users
id_user
username
password
email


Table warranty_members
id_members
user_id
name


Table warranty_product
id_register
member_id
category
model
serial
warranty_no


Table warranty_serials
id_serial
item_code
serial
warranty_no


Table warranty_items
id_items
item_code
category
model
rrp




Tag : PHP, MySQL, Windows, Linux









ประวัติการแก้ไข
2015-11-10 12:43:51
2015-11-10 12:44:08
2015-11-10 12:44:30
2015-11-10 12:44:46
2015-11-10 12:45:14
2015-11-10 12:45:32
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2015-11-10 12:42:52 By : suparuark View : 835 Reply : 9
 

 

No. 1



โพสกระทู้ ( 1,636 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ตาราง warranty_items เกี่ยวข้องยังไงครับ แล้ว แต่จะตารางมี field ใดที่สัมพันธ์กันบ้างครับ
ข้อมูลน้อยไปหน่อยครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-11-10 12:55:49 By : NewbiePHP
 


 

No. 2



โพสกระทู้ ( 37 )
บทความ ( 0 )



สถานะออฟไลน์


จุดที่เชื่อมโยงหากัน
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
 

 

No. 3



โพสกระทู้ ( 1,636 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

อ่านแล้วยังงงอยู่ ลองดูไม่รู้จะตรงความต้องการไหม
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
 


 

No. 4



โพสกระทู้ ( 37 )
บทความ ( 0 )



สถานะออฟไลน์


ผมนำมาดัดแปลงเล็กน้อยจะได้รูปแบบที่ใช้งานได้

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
 


 

No. 5



โพสกระทู้ ( 1,636 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

รูปแบบที่ ทำ เป็นลักษณะ 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
 


 

No. 6



โพสกระทู้ ( 37 )
บทความ ( 0 )



สถานะออฟไลน์


ขอบคุณมากครับ ที่แนะนำ

เผอิญตรวจสอบอีกรอบนึงยังมีการผิดอยู่บ้างครับ

เพราะเช็คดูแล้ว มีบาง username มี rrp อยู่ 1 ค่า แต่ค่าที่แสดงยังเป็น 0 อยู่เลยครับ

Username: adyfaa
Name: NOR FADILAH
Email: [email protected]

1

2
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-11-10 17:50:55 By : suparuark
 


 

No. 7



โพสกระทู้ ( 1,636 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

แล้วใช้คิวรี่แบบไหนครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-11-10 18:21:48 By : NewbiePHP
 


 

No. 8



โพสกระทู้ ( 37 )
บทความ ( 0 )



สถานะออฟไลน์


แบบเดียวกะที่ คุณ NewbieXYZ แนะนำมาเลยครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-11-11 08:52:21 By : suparuark
 


 

No. 9



โพสกระทู้ ( 37 )
บทความ ( 0 )



สถานะออฟไลน์


ขอบคุณ คุณ 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


1


รายละเอียดของแต่ละสมาชิก
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


2


ประวัติการแก้ไข
2015-11-11 11:19:35
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-11-11 11:15:16 By : suparuark
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : ขอคำปรึกษาการแสดงค่าหลายชั้นของ SQL หน่อยครับ ในคิดคำนวณ
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่