กระทู้เก่าบอร์ด อ.Yeadram
1,410 4
URL.หัวข้อ /
URL
หาเรคคอร์ดล่าสุด
คำถาม คือ ในกรณีที่เรามีตาราง(TblRecUp )ข้อมูล ดังนี้
DRUG_ID DATE_RECV QTY_RECV UNITCOST
3 25 /12 /2009 1000 44
3 3 /10 /2009 1262 44
3 3 /10 /2009 48 41 .9047619
4 18 /12 /2009 100 100
4 6 /10 /2009 100 100
4 3 /10 /2009 35 100
4 19 /10 /2009 100 100
4 1/2 /2010 100 100
4 16 /11 /2009 100 100
5 3 /10 /2009 0 140 .17
5 5/1 /2010 60 140 .17
5 16 /10 /2009 60 140 .17
5 13 /11 /2009 60 140 .17
7 3 /10 /2009 0 50
7 18 /12 /2009 20 51 .63
7 4 /10 /2009 5 50
7 4 /12 /2009 5 50
9 3 /10 /2009 70 1348 2
9 3 /10 /2009 2 1348 2
10 2 /11 /2009 200 7.49
10 8/2 /2010 200 7.49
10 3 /10 /2009 160 7.49
10 3 /10 /2009 190 7.49
10 26 /12 /2009 200 7.49
โจทย์คือ เราต้องการทราบราคา(UNITCOST)และวันที่ล่าสุด(DATE_RECV)ที่รหัสแต่ละตัว(DRUG_ID)ได้รับ ผมใช้คำสั่ง SQL ช่วยในการคิวรีข้อมูลดังนี้
SELECT TblRecUp.DRUG_ID, TblRecUp.DATE_RECV, TblRecUp.UNITCOST
FROM TblRecUp
WHERE TblRecUp.UNITCOST In
(SELECT Top 1 UNITCOST
FROM TblRecUp AS Top1
WHERE Top1.DRUG_ID = TblRecUp.DRUG_ID
ORDER BY Top1.DATE_RECV DESC, Top1.UNITCOST DESC)
ORDER BY TblRecUp.DRUG_ID, TblRecUp.DATE_RECV, TblRecUp.UNITCOST;
ผลลัพท์ที่ได้
DRUG_ID DATE_RECV UNITCOST
3 3 /10 /2009 44
3 25 /12 /2009 44
4 3 /10 /2009 100
4 6 /10 /2009 100
4 19 /10 /2009 100
4 16 /11 /2009 100
4 18 /12 /2009 100
4 1/2 /2010 100
5 16 /10 /2009 140 .17
5 13 /11 /2009 140 .17
5 5/1 /2010 140 .17
7 18 /12 /2009 51.63
9 3 /10 /2009 1348 2
9 3 /10 /2009 1348 2
10 3 /10 /2009 7.49
10 3 /10 /2009 7.49
10 2 /11 /2009 7.49
10 26 /12 /2009 7.49
10 8/2 /2010 7.49
ผลลัพท์ที่ต้องการคือ
DRUG_ID DATE_RECV UNITCOST
3 25 /12 /2009 44
4 1/2 /2010 100
5 5/1 /2010 140 .17
7 18 /12 /2009 51 .63
9 3 /10 /2009 1348 2
10 8/2 /2010 7.49
ไม่ทราบว่าผมใช้ ใช้คำสั่ง SQL ผิดหรือเปล่าผมข้อคำอธิบายและถ้าต้องการให้ผลที่ออกมาตามที่ต้องการต้องทำอย่างไร
Jeab
0866320802
zidan184@gmail.com
DRUG_ID DATE_RECV QTY_RECV UNITCOST
3 25 /12 /2009 1000 44
3 3 /10 /2009 1262 44
3 3 /10 /2009 48 41 .9047619
4 18 /12 /2009 100 100
4 6 /10 /2009 100 100
4 3 /10 /2009 35 100
4 19 /10 /2009 100 100
4 1/2 /2010 100 100
4 16 /11 /2009 100 100
5 3 /10 /2009 0 140 .17
5 5/1 /2010 60 140 .17
5 16 /10 /2009 60 140 .17
5 13 /11 /2009 60 140 .17
7 3 /10 /2009 0 50
7 18 /12 /2009 20 51 .63
7 4 /10 /2009 5 50
7 4 /12 /2009 5 50
9 3 /10 /2009 70 1348 2
9 3 /10 /2009 2 1348 2
10 2 /11 /2009 200 7.49
10 8/2 /2010 200 7.49
10 3 /10 /2009 160 7.49
10 3 /10 /2009 190 7.49
10 26 /12 /2009 200 7.49
โจทย์คือ เราต้องการทราบราคา(UNITCOST)และวันที่ล่าสุด(DATE_RECV)ที่รหัสแต่ละตัว(DRUG_ID)ได้รับ ผมใช้คำสั่ง SQL ช่วยในการคิวรีข้อมูลดังนี้
SELECT TblRecUp.DRUG_ID, TblRecUp.DATE_RECV, TblRecUp.UNITCOST
FROM TblRecUp
WHERE TblRecUp.UNITCOST In
(SELECT Top 1 UNITCOST
FROM TblRecUp AS Top1
WHERE Top1.DRUG_ID = TblRecUp.DRUG_ID
ORDER BY Top1.DATE_RECV DESC, Top1.UNITCOST DESC)
ORDER BY TblRecUp.DRUG_ID, TblRecUp.DATE_RECV, TblRecUp.UNITCOST;
ผลลัพท์ที่ได้
DRUG_ID DATE_RECV UNITCOST
3 3 /10 /2009 44
3 25 /12 /2009 44
4 3 /10 /2009 100
4 6 /10 /2009 100
4 19 /10 /2009 100
4 16 /11 /2009 100
4 18 /12 /2009 100
4 1/2 /2010 100
5 16 /10 /2009 140 .17
5 13 /11 /2009 140 .17
5 5/1 /2010 140 .17
7 18 /12 /2009 51.63
9 3 /10 /2009 1348 2
9 3 /10 /2009 1348 2
10 3 /10 /2009 7.49
10 3 /10 /2009 7.49
10 2 /11 /2009 7.49
10 26 /12 /2009 7.49
10 8/2 /2010 7.49
ผลลัพท์ที่ต้องการคือ
DRUG_ID DATE_RECV UNITCOST
3 25 /12 /2009 44
4 1/2 /2010 100
5 5/1 /2010 140 .17
7 18 /12 /2009 51 .63
9 3 /10 /2009 1348 2
10 8/2 /2010 7.49
ไม่ทราบว่าผมใช้ ใช้คำสั่ง SQL ผิดหรือเปล่าผมข้อคำอธิบายและถ้าต้องการให้ผลที่ออกมาตามที่ต้องการต้องทำอย่างไร
Jeab
0866320802
zidan184@gmail.com
4 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R05095
คิวรี่ที่คุณสร้างเกือบใช้ได้แล้ว เพียงแต่ ทำไมคุณใช้ UNITCOST เป็นตัวเปรียบเทียบระหว่าง main query และ sub query ตามที่เขียนไว้ว่า WHERE TblRecUp.UNITCOST In ที่ถูกต้องน่าจะเป็นการใช้ DATE_RECV เป็นตัวเทียบสิครับ ทั้งนี้ทั้งนั้น...ต้องอยู่ภายใต้เงื่อนไขที่ว่า ใน 1 วันจะไม่มีการปรับปรุงราคามากกว่า 1 ครั้ง ถ้ามี..การออกแบบเทเบิลที่เก็บแต่วันที่โดยไม่มีเวลาลงบันทึกไปด้วย จะไม่สามารถให้คำตอบนี้ได้ครับ
และอีกอย่าง ในกรณีอย่างนี้ sub query ควรเป็นตามข้างล่างนี้ถึงจะดูถูกต้องกว่า อ่านแล้วเข้าใจ สั้นกระชับ ตรงจุดประสงค์กว่า
(SELECT Max(DATE_RECV) FROM TblRecUp AS Top1 WHERE Top1.DRUG_ID = TblRecUp.DRUG_ID)
และอีกอย่าง ในกรณีอย่างนี้ sub query ควรเป็นตามข้างล่างนี้ถึงจะดูถูกต้องกว่า อ่านแล้วเข้าใจ สั้นกระชับ ตรงจุดประสงค์กว่า
(SELECT Max(DATE_RECV) FROM TblRecUp AS Top1 WHERE Top1.DRUG_ID = TblRecUp.DRUG_ID)
3 @R05097
อย่างที่ อ.Yeadram บอก ผมไม่แ่น่ใจว่าตรงตามความต้องการหรือไม่ เพราะ max(DATE_RECV) และ max(UNITCOST) นั้น ไม่จำเป็นต้องมาจากเรคอร์ดเดียวกัน อาจต่างเรคอร์ดที่อยู่ในกลุ่ม DRUG_ID เดียวกันก็ได้
4 @R05456
คุณ J007 สรุปโค๊ดที่สมบูรณ์ให้ดูหน่อยได้ไหมครับ ผมกำลังทำเรื่องลักษณะนี้พอดี ขอบคุณครับ
Time: 0.3410s
FROM TblRecUp
group by DRUG_ID;