กระทู้เก่าบอร์ด อ.Yeadram
1,263 6
URL.หัวข้อ /
URL
คิวรี่หาที่อยู่ที่เป็นปัจจุบัน
ผมต้องการ query หาข้อมูลที่อยู่ของพนักงานแต่ละคนตาม adress ซึ่งก็จะมี type คือ 1 =ตามทะเบียนบ้าน และ 2 คือ ที่อยู่ปัจจุบัน ผมต้องการเอาพนักงานที่มีที่อยู่ตาม type 2 เป็นหลัก ถ้าพนักงานคนใดไม่มี type 2 ก็ให้เอา type 1 คือต้องการข้อมูลพนักงาน 1 คนต่อ1 type เท่านั้น
idพนักงาน type address
01 1 จตุจักร
01 2 ตลิ่งชัน
02 1 บางกอกน้อย
02 2 บางกอกใหญ่
03 2 สามเสน
04 1 หลักสี่
ผลลัพธ์คือ
idพนักงาน type address
01 2 ตลิ่งชัน
02 2 บางกอกใหญ่
03 2 สามเสน
04 1 หลักสี่
จริงๆ พนักงานมีหลายพัน record ครับ นี้เป็นบางส่วน ขอบคุณครับ
idพนักงาน type address
01 1 จตุจักร
01 2 ตลิ่งชัน
02 1 บางกอกน้อย
02 2 บางกอกใหญ่
03 2 สามเสน
04 1 หลักสี่
ผลลัพธ์คือ
idพนักงาน type address
01 2 ตลิ่งชัน
02 2 บางกอกใหญ่
03 2 สามเสน
04 1 หลักสี่
จริงๆ พนักงานมีหลายพัน record ครับ นี้เป็นบางส่วน ขอบคุณครับ
6 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R08325
SELECT ID, Type, Address
FROM table1
WHERE Type In (SELECT Max([Type]) FROM Table1 Group By ID;
------------------------------------------------------------------------------------
อย่างนี้หรือเปล่าครับ
FROM table1
WHERE Type In (SELECT Max([Type]) FROM Table1 Group By ID;
------------------------------------------------------------------------------------
อย่างนี้หรือเปล่าครับ
3 @R08326
ทำตามแล้วยังไม่ได้อ่ะ
ของคุณแดน ข้อมูลออกมาทุก record เท่ากับจำนวนเทเบิล ไม่ได้กรองข้อมูลเลย
ส่วนของคุณ yeadram มันขึ้น as part of an aggregate function
อย่างนี้ครับ ต้องการเอาพนักงานที่มีที่มีข้อมูลตาม type 2 เป็นหลัก ถ้าไม่มี type 2 ก็ให้เอา type 1 คือต้องการข้อมูลพนักงาน 1 คนต่อ1 type เท่านั้น และข้อมูลจริงในคอลัมน์ type ไม่ได้เป็น 1 กับ 2 (อันนี้ผมสมมติขึ้นมา) ถ้าเป็นตัวอื่นล่ะเช่น กข1, คก1, ฟฟ2 จะเขียนคิวรี่ยังไงครับ
ของคุณแดน ข้อมูลออกมาทุก record เท่ากับจำนวนเทเบิล ไม่ได้กรองข้อมูลเลย
ส่วนของคุณ yeadram มันขึ้น as part of an aggregate function
อย่างนี้ครับ ต้องการเอาพนักงานที่มีที่มีข้อมูลตาม type 2 เป็นหลัก ถ้าไม่มี type 2 ก็ให้เอา type 1 คือต้องการข้อมูลพนักงาน 1 คนต่อ1 type เท่านั้น และข้อมูลจริงในคอลัมน์ type ไม่ได้เป็น 1 กับ 2 (อันนี้ผมสมมติขึ้นมา) ถ้าเป็นตัวอื่นล่ะเช่น กข1, คก1, ฟฟ2 จะเขียนคิวรี่ยังไงครับ
4 @R08329
1 ผมผิดครับ! ตอนให้ statement ไป ผมลืม group ให้ ดังนั้น แก้ไขเป็น
select id, max(table1.[type]) as mType, address
from table1
group by id, address;
2 คุณผิด! อย่างมากเลยครับ ทำให้เดาผิด ชนิดข้อมูลของฟิลด์ Type ของคุณ ตัวอย่างตอนแรกเป็น 1 หรือ 2 ทำให้เข้าใจว่าเป็นชนิดข้อมูลแบบ number ตอนหลังแจ้งว่าเป็น text อยากบอกคุณให้เข้าใจครับว่า โปรแกรม access มันใช้สำหรับจัดการข้อมูล ถ้าคุณคิดจะ "จัดการ" กับข้อมูล คุณต้องรู้จักข้อมูล ต้องแยกแยะมันและให้ความสำคัญมันเป็นอันดับต้นๆ หรืออันดับแรกเลยล่ะ เช่น ชนิดข้อมูล ความกว้างของฟิลด์ ถ้าคุณบอกไม่ชัด มันก็ไปคนละทางกันเลย
statement ที่ผมให้ไป ผมใช้ Max() เพราะคิดว่า มันเป็น number ดังนั้น max() จะทำงานได้ อย่างไม่มีปัญหา
แต่ตอนนี้ เริ่มไม่มั่นใจแล้ว จริงอยู่แม้โดยพื้นฐานแล้ว ระบบ Access จะช่วยปรับปรุงหรือเรียบเรียงเปลี่ยนแปลงข้อมูลให้บ้างเพื่อความเหมาะสม ก่อนนำข้อมูลเข้าประมวลผลในฟังก์ชั่น แต่เราก็ไม่ควรหวังพึ่งมันมากนัก เพราะเมื่อมันทำงานผิดประเภท โอกาสพลาดก็มีสูง
ตัวอย่าง
- ถ้ากลุ่มข้อมูล มี ( 1, 2, 4, 75, 99 ) ถ้าให้หาค่าสูงสุดโดย max() มันจะตอบ 99 แน่นอน มั่นใจมากๆ เพราะข้อมูลทั้งหมดมันเป็น number มีคุณสมบัติในการเปรียบเทียบค่าที่ง่าย
- ถ้ากลุ่มข้อมูล มี ( 1, 2, กค, ฟ1, 1ฮ, 2cc, a9 ) ถ้าให้คุณหาค่าสูงสุด คุณจะตอบว่าเท่าไร ??
ดังนั้นสายอักขระ หรือ statement ที่ผมให้ไปในตอนแรก และแม้กระทั่งชุดที่แก้ไขใหม่นี้ ก็ยังไม่มีการรับประกันได้ว่า มันจะทำงานได้ถูกต้อง เพราะว่า ชนิดข้อมูลในฟิลด์ Type ของคุณมันเป็น text อาจจะให้คำตอบที่ผิดเพี้ยนในกรณีทำงานร่วมกับฟังก์ชั่น Max() คุณอาจต้องเปลี่ยนไปใช้ if และ sum แทน ซึ่งตอนนี้ยังไม่สามารถยกตัวอย่างได้ จนกว่า จะเห็นชนิดข้อมูล, รูปแบบข้อมูล, ความกว้างข้อมูล ของคุณที่แท้จริง
select id, max(table1.[type]) as mType, address
from table1
group by id, address;
2 คุณผิด! อย่างมากเลยครับ ทำให้เดาผิด ชนิดข้อมูลของฟิลด์ Type ของคุณ ตัวอย่างตอนแรกเป็น 1 หรือ 2 ทำให้เข้าใจว่าเป็นชนิดข้อมูลแบบ number ตอนหลังแจ้งว่าเป็น text อยากบอกคุณให้เข้าใจครับว่า โปรแกรม access มันใช้สำหรับจัดการข้อมูล ถ้าคุณคิดจะ "จัดการ" กับข้อมูล คุณต้องรู้จักข้อมูล ต้องแยกแยะมันและให้ความสำคัญมันเป็นอันดับต้นๆ หรืออันดับแรกเลยล่ะ เช่น ชนิดข้อมูล ความกว้างของฟิลด์ ถ้าคุณบอกไม่ชัด มันก็ไปคนละทางกันเลย
statement ที่ผมให้ไป ผมใช้ Max() เพราะคิดว่า มันเป็น number ดังนั้น max() จะทำงานได้ อย่างไม่มีปัญหา
แต่ตอนนี้ เริ่มไม่มั่นใจแล้ว จริงอยู่แม้โดยพื้นฐานแล้ว ระบบ Access จะช่วยปรับปรุงหรือเรียบเรียงเปลี่ยนแปลงข้อมูลให้บ้างเพื่อความเหมาะสม ก่อนนำข้อมูลเข้าประมวลผลในฟังก์ชั่น แต่เราก็ไม่ควรหวังพึ่งมันมากนัก เพราะเมื่อมันทำงานผิดประเภท โอกาสพลาดก็มีสูง
ตัวอย่าง
- ถ้ากลุ่มข้อมูล มี ( 1, 2, 4, 75, 99 ) ถ้าให้หาค่าสูงสุดโดย max() มันจะตอบ 99 แน่นอน มั่นใจมากๆ เพราะข้อมูลทั้งหมดมันเป็น number มีคุณสมบัติในการเปรียบเทียบค่าที่ง่าย
- ถ้ากลุ่มข้อมูล มี ( 1, 2, กค, ฟ1, 1ฮ, 2cc, a9 ) ถ้าให้คุณหาค่าสูงสุด คุณจะตอบว่าเท่าไร ??
ดังนั้นสายอักขระ หรือ statement ที่ผมให้ไปในตอนแรก และแม้กระทั่งชุดที่แก้ไขใหม่นี้ ก็ยังไม่มีการรับประกันได้ว่า มันจะทำงานได้ถูกต้อง เพราะว่า ชนิดข้อมูลในฟิลด์ Type ของคุณมันเป็น text อาจจะให้คำตอบที่ผิดเพี้ยนในกรณีทำงานร่วมกับฟังก์ชั่น Max() คุณอาจต้องเปลี่ยนไปใช้ if และ sum แทน ซึ่งตอนนี้ยังไม่สามารถยกตัวอย่างได้ จนกว่า จะเห็นชนิดข้อมูล, รูปแบบข้อมูล, ความกว้างข้อมูล ของคุณที่แท้จริง
5 @R08330
ครับตามที่คุณ yeadram แนะนำไว้ถูกต้องเลย...ครับ
เอาข้อมูลที่แท้จริงมายกตัวอย่างดีกว่าเพื่อที่จะได้แก้ปัญหาได้ตรงจุดในคราวเดียว
ตัวอย่างที่ผมให้ไปในคราวแรกมีข้อผิดพลาดหนะครับตรงชื่อมันซ้ำซ้อนกัน
ผมแก้มาให้ใหม่ละ
SELECT ID, Type, Address
FROM table1
WHERE Type In (SELECT MAX(TM.[TYPE]) FROM TABLE1 AS TM WHERE TM.ID = TABLE1.ID);
เอาข้อมูลที่แท้จริงมายกตัวอย่างดีกว่าเพื่อที่จะได้แก้ปัญหาได้ตรงจุดในคราวเดียว
ตัวอย่างที่ผมให้ไปในคราวแรกมีข้อผิดพลาดหนะครับตรงชื่อมันซ้ำซ้อนกัน
ผมแก้มาให้ใหม่ละ
SELECT ID, Type, Address
FROM table1
WHERE Type In (SELECT MAX(TM.[TYPE]) FROM TABLE1 AS TM WHERE TM.ID = TABLE1.ID);
6 @R08347
ขอบคุณทั้ง 2 ท่านครับ
ตามคิวรี่ของคุณแดนออกตรงตามโจทย์ข้างบนครับ
ตามคิวรี่ของคุณแดนออกตรงตามโจทย์ข้างบนครับ
Time: 0.2649s
from table1;
คำว่า type เป็นคำสงวนของระบบ ไม่ควรนำมาตั้งชื่อ