19
ห้อง MS Access / : Queries
« เมื่อ: 24 ธ.ค. 62 , 14:35:29 »
Query ที่ชื่อว่าผลรวมของแต่ละ Lot ค่ะ
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
ลองสร้างคิวรี่ ใส่ sql นี้เข้าไปแล้วดูผลลัพธ์นะครับ
ผมหา ตาราง Customer , Product , Gcas ไม่เจอเลยไม่ได้เพิ่มส่วนนี้ให้นะครับ
ไม่รู้ผมเข้าใจถูกไหมนะครับ
คือ
1. หา Place โดยการ GroupBy ให้เหลือ Place 1 ตัว ถ้าซ้ำกันก็รวมกันให้ไม่ซ้ำ
2. ส่วนการหา Inhouse (จากวันที่ล่าสุด) นำคิวรี่ warehouse - รหัสสินค้า มาเชื่อม ความสัมพันธ์ กับ warehouse - จำนวนสินค้า ตรง Place
แล้วดึง Inhouse มาแสดง
แต่ กรณีที่ Place เดียวกัน แต่มี INHOUSE ไม่เหมือนกันทำยังไงครับ
SELECT [Place - Boxes (In)].Place, Nz([SumOfBoxin])+0 AS [จำนวนรับเข้า (ลัง-ห่อ)], Nz([SumOfBoxout])+0 AS [จำนวนจ่ายออก (ลัง-ห่อ)], [จำนวนรับเข้า (ลัง-ห่อ)]-[จำนวนจ่ายออก (ลัง-ห่อ)] AS [จำนวนคงเหลือ (ลัง-ห่อ)], Nz([SumOfPCSin])+0 AS [จำนวนเศษรับเข้า (ชิ้น)], Nz([SumOfPCSout])+0 AS [จำนวนเศษจ่ายออก (ชิ้น)], [จำนวนเศษรับเข้า (ชิ้น)]-[จำนวนเศษจ่ายออก (ชิ้น)] AS [จำนวนเศษคงเหลือ (ชิ้น)]
FROM (([Place - Boxes (In)] LEFT JOIN [Place - Boxes (out)] ON [Place - Boxes (In)].Place = [Place - Boxes (out)].Place) LEFT JOIN [Place - Pcs (In)] ON [Place - Boxes (In)].Place = [Place - Pcs (In)].Place) LEFT JOIN [Place - Pcs (out)] ON [Place - Boxes (In)].Place = [Place - Pcs (out)].Place;U
UNION SELECT T1.*, (select sum(T3.Inboxes) from [In] as T3 where T3.place = T1.place) AS [Sum]
FROM [In] AS T1
WHERE (((T1.date)=(select max(T2.[date]) from [In] as T2 where T2.place = T1.place)));
ผมไม่ค่อยแน่ใจถึงสิ่งที่ต้องการ แต่เอาเป็นว่า ถ้าต้องรวมตาม [place] และ [product] เดียวกัน ก็แก้ส่วน sum โดยเพิ่มเงื่อนไข and เข้าไปในส่วนของ where ตามโค้ดข้างล่างนี้ แต่ถ้าต้องมีเงื่อนไขฟิลด์อื่นเพิ่มเติม ก็ทำในลักษณะเดียวกัน คือเพิ่ม and เข้าไปอีกครับ
select T1.*,(select sum(T3.Inboxes) from [In] as T3 where (T3.place = T1.place) and (T3.product = T1.product)) as SumOfBoxin
from [In] as T1
where T1.[date] = (select max(T2.[date]) from [In] as T2 where T2.place = T1.place)
ยังไงก็ทดสอบผลลัพธ์กับข้อมูลเยอะๆ เพื่อดูว่าถูกต้องหรือไม่ด้วย
เปลี่ยนโหมดคิวรี่จาก Design View ไปเป็น SQL View แล้วเขียนคำสั่งนี้ลงไปแทนครับ
select T1.*, (select sum(T3.Inboxes) from [In] as T3 where T3.place = T1.place) as SumOfBoxin
from [In] as T1
where T1.[date] = (select max(T2.[date]) from [In] as T2 where T2.place = T1.place)
1. กลับไปที่ภาพที่ 2 ในคำถามแรก วันที่ล่าสุดที่ต้องการคือวันที่เท่าไหร่ และความหมาของคำว่า "ล่าสุด" คืออะไร วันที่มีค่ามากสุดของ Place นั้นๆ หรือ วันที่มีค่ามากสุดก่อนวันปัจจุบันสำหรับ Place นั้นๆ หรืออะไร ?
2. กลับไปภาพที่ 1 ฟิลด์อื่นๆ ยกเว้นฟิลด์ที่เป็นผลรวมจากฟังก์ชั่น Sum ฟิลด์เหล่านั้นได้มาจากเรคอร์ดเดียวกันกับเรคอร์ดของวันที่ "ล่าสุด" ใช่หรือไม่ หรือได้มาจากไหน ?
3. ฟิลด์ผลรวมจากฟังก์ชั่น Sum เกิดจากการรวมตั้งแต่วันไหนจนถึงวันไหน ?
ปล. ส่วนใหญ่คุณจะเขียนไม่ชัดเจน
ครั้งหน้าอยากให้ตั้งคำถามให้ชัดเจนหน่อยนะครับ
ถ้าคุณต้องการอย่างกระทู้ล่าสุด คุณต้องสร้างคิวรีเพื่อดึงเฉพาะข้อมูลสถานที่มาก่อน 1 คิวรี (สมมติชื่อ qryA) แล้วกำหนดเป็น Unique Value เพื่อกรองเอาข้อมูลที่ Duplicated ออก
จากนั้นก็สร้างคิวรีอีก 1 อัน โดยนำ qryA มาใส่ Code Dlast ของฟิลด์ Date
อันนี้คือหลักการนะครับ ที่เหลือคุณต้องลองเอง
คือเขียนคิวรี่ ใช้คำสั่ง count แล้วอยากให้แสดงค่าที่ค้นไม่เจอให้=0แบบนี้ต้องทำไงครับ หรือต้องไปกำหนดที่ textbox ครับให้มี defult =0 (ตรงนี้ต้องไปตั้งค่ายังไงครับ) ขอบคุณครับ