กระทู้เก่าบอร์ด อ.Yeadram
1,554 4
URL.หัวข้อ /
URL
ต้องการหาผลต่างของแต่ละ Record ครับ
Table1 มีข้อมูลต่อไปนี้
Record Mat Qty
3 C 200
3 A 250
2 B 150
2 A 200
1 C 320
1 B 250
1 A 300
ผมอยากสร้าง query ที่เอา Record ที่มากกว่า มาลบ Record ที่น้อยกว่าในอันดับต่อไป แยกตาม Mat ครับ ก็จะได้ออกมาประมาณนี้ครับ
Record Mat Qty Diff
3 C 200 200
3 A 250 50
2 B 150 100
2 A 200 100
1 C 320 320
1 B 250 250
1 A 300 300
โดยคำตอบทำ ABS ทั้งหมดเลยครับ
ขอบคุณทุกคำตอบครับ
Record Mat Qty
3 C 200
3 A 250
2 B 150
2 A 200
1 C 320
1 B 250
1 A 300
ผมอยากสร้าง query ที่เอา Record ที่มากกว่า มาลบ Record ที่น้อยกว่าในอันดับต่อไป แยกตาม Mat ครับ ก็จะได้ออกมาประมาณนี้ครับ
Record Mat Qty Diff
3 C 200 200
3 A 250 50
2 B 150 100
2 A 200 100
1 C 320 320
1 B 250 250
1 A 300 300
โดยคำตอบทำ ABS ทั้งหมดเลยครับ
ขอบคุณทุกคำตอบครับ
4 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R01206
คงใช้ ชื่อ Field ที่ทำให้สับสนครับ
ขอเปลี่ยนคำว่า Record เป็น Doc แล้วกันนะครับ
มีข้อมูลประมาณนี้ ขอลดข้อมูลเหลือข้อมูลให้เป็นรูปแบบง่าย ๆ นะครับ
Doc Mat Qty
3 A 250
2 A 200
1 A 300
คำตอบที่ได้ก็ประมาณนี้ครับ
Doc Mat Qty คำตอบ
3 A 250 50 (เอา Qty ของ Doc 3 Mat A ไปลบกับ Qty ของ Doc 2 Mat A)
2 A 200 100 (เอา Qty ของ Doc 2 Mat A ไปลบกับ Qty ของ Doc 1 Mat A)
1 A 300 300 (ไม่มี Doc ที่น้อยกว่า Doc 1 คำตอบก็ให้ใช้ Qty ของ Doc นั้นเลยครับ)
ขอบคุณครับ
ขอเปลี่ยนคำว่า Record เป็น Doc แล้วกันนะครับ
มีข้อมูลประมาณนี้ ขอลดข้อมูลเหลือข้อมูลให้เป็นรูปแบบง่าย ๆ นะครับ
Doc Mat Qty
3 A 250
2 A 200
1 A 300
คำตอบที่ได้ก็ประมาณนี้ครับ
Doc Mat Qty คำตอบ
3 A 250 50 (เอา Qty ของ Doc 3 Mat A ไปลบกับ Qty ของ Doc 2 Mat A)
2 A 200 100 (เอา Qty ของ Doc 2 Mat A ไปลบกับ Qty ของ Doc 1 Mat A)
1 A 300 300 (ไม่มี Doc ที่น้อยกว่า Doc 1 คำตอบก็ให้ใช้ Qty ของ Doc นั้นเลยครับ)
ขอบคุณครับ
3 @R01211
Select T1.Doc, T1.Mat, T1.Qty, Abs(T1.Qty - Nz( ( Select T2.Qty from T as T2 where (T2.Mat = T1.Mat) and (T2.Doc = (Select Max(T3.Doc) from T as T3 where (T3.Mat = T1.Mat) and (T3.Doc < T1.Doc) ) )) ,0)) from T as T1 order by T1.Doc Desc, T1.Mat
อาจดูซับซ้อนสักหน่อย ค่อยๆไล่ไปนะครับ
(1) Select Max(T3.Doc) from T as T3 where (T3.Mat = T1.Mat) and (T3.Doc < T1.Doc) ส่วนนี้เพื่อหา เลขลำดับ ที่มากที่สุด ที่น้อยกว่าเลขที่กำลังประมวลผล เช่นถ้ากำลังประมวลผลเรคอร์ดที่มีเลข Doc = 3 ผลลัพธ์ก็จะให้เลข Doc = 2 ออกมา
(2) Select T2.Qty from T as T2 where (T2.Mat = T1.Mat) and (T2.Doc = ... ส่วนนี้ก็หา Qty จากเรคอร์ดที่มี Doc เท่ากับเลขที่หาได้จาก Sub Query ที่ (1)
(3) Select T1.Doc, T1.Mat, T1.Qty, Abs(T1.Qty - Nz( ... ส่วนนี้แสดงผลต่างของ Qty ที่กำลังประมวลผลกับ Qty ที่ได้จาก Sub Query ที่ (2)
อาจดูซับซ้อนสักหน่อย ค่อยๆไล่ไปนะครับ
(1) Select Max(T3.Doc) from T as T3 where (T3.Mat = T1.Mat) and (T3.Doc < T1.Doc) ส่วนนี้เพื่อหา เลขลำดับ ที่มากที่สุด ที่น้อยกว่าเลขที่กำลังประมวลผล เช่นถ้ากำลังประมวลผลเรคอร์ดที่มีเลข Doc = 3 ผลลัพธ์ก็จะให้เลข Doc = 2 ออกมา
(2) Select T2.Qty from T as T2 where (T2.Mat = T1.Mat) and (T2.Doc = ... ส่วนนี้ก็หา Qty จากเรคอร์ดที่มี Doc เท่ากับเลขที่หาได้จาก Sub Query ที่ (1)
(3) Select T1.Doc, T1.Mat, T1.Qty, Abs(T1.Qty - Nz( ... ส่วนนี้แสดงผลต่างของ Qty ที่กำลังประมวลผลกับ Qty ที่ได้จาก Sub Query ที่ (2)
4 @R01229
อื้อหือ
ท่าทางต้องทำความเข้าใจอีกเยอะเลยครับ
ซ้อนกัน 3 รอบเลย
ผลลัพทธ์ได้ตามที่ต้องการเลยครับ
ขอบคุณคุณสันติสุขมากครับ
ท่าทางต้องทำความเข้าใจอีกเยอะเลยครับ
ซ้อนกัน 3 รอบเลย
ผลลัพทธ์ได้ตามที่ต้องการเลยครับ
ขอบคุณคุณสันติสุขมากครับ
Time: 0.3210s
รู้ได้ไงว่าเรคคอร์ดไหนมากกว่า?? ดูจากอะไร??
แล้วเอาอะไรไปลบอะไร?
เอา C ไปลบ 200 มันไม่มีผลลัพธ์นะครับ
มันมี ทั้งหมด 7 เรคคอร์ด จะเอาเรคคอร์ดที่ 1 ไปลบเรคคอร์ดที่เท่าไหร่บ้าง แล้วเรคคอร์ดที่ 7 จะไปลบกับเรคคอร์ดไหน
คำถามไม่ชัดเจนครับ