กระทู้เก่าบอร์ด อ.Yeadram
2,123 5
URL.หัวข้อ /
URL
หาผลต่างจากตาราง2ตาราง
ขอเรียนถามอาจารย์ดังนี้ครับ
หากต้องการเปรียบเทียบตาราง2ตารางซึ่งมี2ฟิลย์เหมือนกันคือP_IDและR_ID ต่างกัน1ฟิลย์คือ BK_PAYและDETAIL_PAY แต่จำนวน record ในตารางทั้งอาจเท่าหรือไม่เท่ากัน
ดังนี้
ตาราง TB1
P_ID R_ID BK_PAY
1 116 3
1 790 3
1 1029 4
1 1268 3
2 1296 10
2 1378 3
2 1784 4
2 1881 4
2 1957 10
3 2023 3
3 2149 4
3 2570 4
3 2580 2
3 2652 10
3 2808 2
3 3053 4
ตาราง TB2
P_ID R_ID DETAIL_PAY
1 116 3
1 790 3
1 1029 4
1 1268 3
1 1270 5
2 1296 10
2 1378 3
2 1784 2
2 1881 4
2 1957 10
3 2023 3
3 2149 4
3 2570 4
3 2652 10
3 2808 2
3 3053 4
3 3060 1
ความต้องการก็คือ
1.ต้องการหาR_ID ของ P_ID แต่ละรายการที่ตาราง TB1 มีแต่ตาราง TB2 ไม่มี หรือในทางกลับกัน หา R_ID ของ P_ID แต่ละรายการที่ตาราง TB1 ไม่มีแต่ตาราง TB2 มี และ
2. ต้องการหาR_ID ที่ทั้งสองตารางมีแต่ค่าของฟิลย์ BK_PAY ของตาราง TB1 ไม่เท่ากับฟิลย์ DETAIL_PAY
ผลลัทพ์ที่ต้องการคือ
P_ID R_ID BK_PAY DETAIL_PAY
1 1270 0 5
2 1784 4 2
3 2580 2 0
3 3060 0 1
อยากจะขอคำแนะนำจากอาจารย์ ต้องทำยังไงครับ
รบกวนอาจารย์ด้วยนะครับ
หากต้องการเปรียบเทียบตาราง2ตารางซึ่งมี2ฟิลย์เหมือนกันคือP_IDและR_ID ต่างกัน1ฟิลย์คือ BK_PAYและDETAIL_PAY แต่จำนวน record ในตารางทั้งอาจเท่าหรือไม่เท่ากัน
ดังนี้
ตาราง TB1
P_ID R_ID BK_PAY
1 116 3
1 790 3
1 1029 4
1 1268 3
2 1296 10
2 1378 3
2 1784 4
2 1881 4
2 1957 10
3 2023 3
3 2149 4
3 2570 4
3 2580 2
3 2652 10
3 2808 2
3 3053 4
ตาราง TB2
P_ID R_ID DETAIL_PAY
1 116 3
1 790 3
1 1029 4
1 1268 3
1 1270 5
2 1296 10
2 1378 3
2 1784 2
2 1881 4
2 1957 10
3 2023 3
3 2149 4
3 2570 4
3 2652 10
3 2808 2
3 3053 4
3 3060 1
ความต้องการก็คือ
1.ต้องการหาR_ID ของ P_ID แต่ละรายการที่ตาราง TB1 มีแต่ตาราง TB2 ไม่มี หรือในทางกลับกัน หา R_ID ของ P_ID แต่ละรายการที่ตาราง TB1 ไม่มีแต่ตาราง TB2 มี และ
2. ต้องการหาR_ID ที่ทั้งสองตารางมีแต่ค่าของฟิลย์ BK_PAY ของตาราง TB1 ไม่เท่ากับฟิลย์ DETAIL_PAY
ผลลัทพ์ที่ต้องการคือ
P_ID R_ID BK_PAY DETAIL_PAY
1 1270 0 5
2 1784 4 2
3 2580 2 0
3 3060 0 1
อยากจะขอคำแนะนำจากอาจารย์ ต้องทำยังไงครับ
รบกวนอาจารย์ด้วยนะครับ
5 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R10945
เรียนอาจารย์ yeardrum ผมใช้ access version 2003 ครับ
กรณีแรก ความต้องการข้อที่ 1 ผมใช้แบบสอบถามแบบหาข้อมูลไม่ซ้ำทำได้แล้วครับ
แต่ ตามความต้องการข้อ 2 ความต้องการเป็นแบบที่อาจารย์เดาถูกแล้วครับ คือ ต้องการหาR_ID ที่ P_ID ของทั้งสองตารางตรงกัน แต่ค่าของฟิลย์ BK_PAY ไม่เท่ากับฟิลย์ DETAIL_PAY
ผมทำตามที่อาจารย์แนะนำ ดังภาพ
เมื่อรัน query แล้วผลลัทพ์ที่ได้ ดังภาพ ซึ่งยังไม่ได้ตามที่ต้องการ รบกวนอาจารย์ช่วยแนะนำด่อด้วยครับ
...
กรณีแรก ความต้องการข้อที่ 1 ผมใช้แบบสอบถามแบบหาข้อมูลไม่ซ้ำทำได้แล้วครับ
แต่ ตามความต้องการข้อ 2 ความต้องการเป็นแบบที่อาจารย์เดาถูกแล้วครับ คือ ต้องการหาR_ID ที่ P_ID ของทั้งสองตารางตรงกัน แต่ค่าของฟิลย์ BK_PAY ไม่เท่ากับฟิลย์ DETAIL_PAY
ผมทำตามที่อาจารย์แนะนำ ดังภาพ
เมื่อรัน query แล้วผลลัทพ์ที่ได้ ดังภาพ ซึ่งยังไม่ได้ตามที่ต้องการ รบกวนอาจารย์ช่วยแนะนำด่อด้วยครับ
...
3 @R10946
ขอแก้ไขภาพแรกครับ
4 @R10953
ชักจะงงครับ กลับไปอ่านความต้องการใหม่อีกครับ และดูตัวอย่างข้อมูลของโจทก์แล้วยังไม่ค่อยแน่ใจเท่าไร เอาเป็นว่าขอแนะนำอย่างนี้ไปก่อน ไม่รู้จะตรงความต้องการหรือเปล่า
- ให้ลืมๆ วิธีทำข้อ 2 ที่ผมแนะนำไปเลยครับ
- ให้สร้างคิวรี่ตามวิธีที่ 1 (ใช้วิซาร์ดช่วยสร้าง) โดย..
1) สร้างคิวรี่ ที่มี ใน 1 แต่ไม่มีใน 2 (TB1 right join TB2)
select P_ID, R_ID, BK_Pay as BK, 0 As Detail
from tb1 right join TB2 on tb1.P_ID = tb2.P_ID
where tb2.R_ID is null;
เซฟเป็นคิวรี่ชื่อ qr_1_not_2
2) สร้างคิวรี่กลับทางกัน มาอีกตัว เซฟเป็นคิวรี่ชื่อ qr_2_not_1
Select P_ID, R_ID, 0 as BK, Detail_Pay as Detail
From tb2 right join tb1 on tb2.P_ID=tb1.P_ID
Where tb1.R_ID is null;
3) เอาคิวรี่ทั้งสอง มารวมกันด้วย Union ตั้งชื่อคิวรี่ใหม่ว่า qrUnionDiff
Select * from qr_1_not_2
UNION
Select * from qr_2_not_1;
4) สร้างคิวรี่ชุดสุดท้ายเพื่อจัดกลุ่มข้อมูล เซฟคิวรี่เป็น myQuery
Select P_ID, R_ID, sum(BK) as BK_Pay, sum(Detail) as Detail_Pay
From qrUnionDiff
Group by P_ID, R_ID
Order by P_ID, R_ID;
ลองรันดูครับ
ผลลัพธ์ที่คุณต้องการจะเห็นได้ในการรัน คิวรี่ตัวสุดท้ายนะครับ
แต่คิวรี่อีก 3 ตัวก่อนหน้านั้นมีความสำคัญทั้งหมด ห้ามลบเด็ดขาด ไม่งั้นคิวรี่ตัวสุดท้ายจะทำงานไม่ได้
ปล. คุณสามารถรวบทั้งหมดให้มาอยู่ในคิวรี่เดียวกันได้เลย ด้วยการใช้ sub query แต่อย่าเพิ่งเลยครับ เอาแบบยืดเยื้อนี้ก่อน เพื่อให้เข้าใจง่าย
- ให้ลืมๆ วิธีทำข้อ 2 ที่ผมแนะนำไปเลยครับ
- ให้สร้างคิวรี่ตามวิธีที่ 1 (ใช้วิซาร์ดช่วยสร้าง) โดย..
1) สร้างคิวรี่ ที่มี ใน 1 แต่ไม่มีใน 2 (TB1 right join TB2)
select P_ID, R_ID, BK_Pay as BK, 0 As Detail
from tb1 right join TB2 on tb1.P_ID = tb2.P_ID
where tb2.R_ID is null;
เซฟเป็นคิวรี่ชื่อ qr_1_not_2
2) สร้างคิวรี่กลับทางกัน มาอีกตัว เซฟเป็นคิวรี่ชื่อ qr_2_not_1
Select P_ID, R_ID, 0 as BK, Detail_Pay as Detail
From tb2 right join tb1 on tb2.P_ID=tb1.P_ID
Where tb1.R_ID is null;
3) เอาคิวรี่ทั้งสอง มารวมกันด้วย Union ตั้งชื่อคิวรี่ใหม่ว่า qrUnionDiff
Select * from qr_1_not_2
UNION
Select * from qr_2_not_1;
4) สร้างคิวรี่ชุดสุดท้ายเพื่อจัดกลุ่มข้อมูล เซฟคิวรี่เป็น myQuery
Select P_ID, R_ID, sum(BK) as BK_Pay, sum(Detail) as Detail_Pay
From qrUnionDiff
Group by P_ID, R_ID
Order by P_ID, R_ID;
ลองรันดูครับ
ผลลัพธ์ที่คุณต้องการจะเห็นได้ในการรัน คิวรี่ตัวสุดท้ายนะครับ
แต่คิวรี่อีก 3 ตัวก่อนหน้านั้นมีความสำคัญทั้งหมด ห้ามลบเด็ดขาด ไม่งั้นคิวรี่ตัวสุดท้ายจะทำงานไม่ได้
ปล. คุณสามารถรวบทั้งหมดให้มาอยู่ในคิวรี่เดียวกันได้เลย ด้วยการใช้ sub query แต่อย่าเพิ่งเลยครับ เอาแบบยืดเยื้อนี้ก่อน เพื่อให้เข้าใจง่าย
5 @R10976
ต้องขอขอบคุณอาจารย์ yeadram มากๆเลยสำหรับความรู้ที่ได้
สำหรับความต้องการข้อ 2 ผมทำตามที่อาจารย์แนะนำแบบเดิม แต่ผมลองเปลี่ยนใช้เม้าส์จับลากชื่อฟิลด์ R_ID ของตาราง TB1 ไปวางใส่ฟิลด์ R_ID ของ TB2 แล้วลองรันดู ปรากฏว่าได้ตามความต้องการเลยครับ
ขอบคุณอาจารย์ yeadram มากๆ เลยครับ
สำหรับความต้องการข้อ 2 ผมทำตามที่อาจารย์แนะนำแบบเดิม แต่ผมลองเปลี่ยนใช้เม้าส์จับลากชื่อฟิลด์ R_ID ของตาราง TB1 ไปวางใส่ฟิลด์ R_ID ของ TB2 แล้วลองรันดู ปรากฏว่าได้ตามความต้องการเลยครับ
ขอบคุณอาจารย์ yeadram มากๆ เลยครับ
Time: 0.3723s
Access มีวิซาร์ดช่วยสำหรับการสร้างคิวรี่แบบนี้ครับ ลองดูตามเมนูคำสั่งในกลุ่มคิวรี่ดูนะครับ
ตามความต้องการข้อ 2 พิมพ์ตกไปหรือเปล่า ผมเดาว่าจะเป็นประมาณนี้
"ต้องการหาR_ID ที่ P_ID ของทั้งสองตารางตรงกัน แต่ค่าของฟิลย์ BK_PAY ไม่เท่ากับฟิลย์ DETAIL_PAY"
สร้างคิวรี่เหมือนกันครับ (ไม่ทราบว่าใช้เวอร์ชั่นไหนอยู่) ถ้าเป็น Access เวอร์ชั่น 2000-2002-2003 (เวอร์ชั่นอื่นๆ ไม่คุ้นครับ ไม่แน่ใจว่าจะเหมือนกันหรือเปล่า)
- สร้างคิวรี่ใหม่ 1 ตัว
- เลือกตารางทั้งสองตาราง
- ใช้เม้าส์จับลากชื่อฟิลด์ P_ID ของตาราง TB1 ไปวางใส่ฟิลด์ P_ID ของ TB2 มันจะสร้างเส้นสัมพันธ์ถึงกัน
- ในส่วนแสดงผล ช่องที่ 1, ลากฟิลด์ R_ID จากตาราง TB1 ไปวาง
- ในส่วนแสดงผล ช่องที่ 2, ลากฟิลด์ P_ID จากตาราง TB1 ไปวาง
- ในส่วนแสดงผล ช่องที่ 3, ลากฟิลด์ BK_PAY ไปวาง และในบรรทัดเงื่อนไขของช่องนี้ ให้เขียนว่า <>DETAIL_PAY
- ในส่วนแสดงผล ช่องที่ 4 ลากฟิลด์ DETAIL_PAY ไปวาง
- สั่งบันทึกคิวรี่แล้วลองรันดูครับ