กระทู้เก่าบอร์ด อ.Yeadram
1,301 6
URL.หัวข้อ /
URL
มีวิธีการเรียงข้อมูลตามกลุ่มและ update ข้อมูลในฟิล
เรียนถามอาจารย์ทุกท่านครับ...ผมมีตาราง ชื่อ student (,HN,NoLab)
จะมีวิธีเขียนอย่างไรให้ได้ข้อมูลเรียงลำดับ(ordinal)ตามกลุ่มข้อมูล class sex และ id_stud โดยเรียงลำดับตาม(NO) ข้อมูลมีแบบนี้ครับ
id_stud sex class ordinal
200 1 ม.1/1
201 1 ม.1/1
202 1 ม.1/1
195 2 ม.1/1
196 2 ม.1/1
197 2 ม.1/1
087 1 ม.1/2
088 1 ม.1/2
089 1 ม.1/2
056 2 ม.1/2
057 2 ม.1/2
058 2 ม.1/2
จะมีวิธีการเขียน code อย่างไรให้ได้ข้อมูลอย่างไรให้ update ฟิลด์ ordinal ให้เรียงตามข้อมูลข้างล่างครับ สรุปก็คือ เรียงตาม class sex และ id_stud จากน้อยไปหามาก จัดเป็นกลุ่มๆครับ โดยผลลัพธ์เมื่อ update ข้อมูลแล้วได้
id_stud sex class ordinal
200 1 ม.1/1 1
201 1 ม.1/1 2
202 1 ม.1/1 3
195 2 ม.1/1 4
196 2 ม.1/1 5
197 2 ม.1/1 6
--------------------------------
087 1 ม.1/2 1
088 1 ม.1/2 2
089 1 ม.1/2 3
056 2 ม.1/2 4
057 2 ม.1/2 5
058 2 ม.1/2 6
---------------------------------
จะมีวิธีเขียนอย่างไรให้ได้ข้อมูลเรียงลำดับ(ordinal)ตามกลุ่มข้อมูล class sex และ id_stud โดยเรียงลำดับตาม(NO) ข้อมูลมีแบบนี้ครับ
id_stud sex class ordinal
200 1 ม.1/1
201 1 ม.1/1
202 1 ม.1/1
195 2 ม.1/1
196 2 ม.1/1
197 2 ม.1/1
087 1 ม.1/2
088 1 ม.1/2
089 1 ม.1/2
056 2 ม.1/2
057 2 ม.1/2
058 2 ม.1/2
จะมีวิธีการเขียน code อย่างไรให้ได้ข้อมูลอย่างไรให้ update ฟิลด์ ordinal ให้เรียงตามข้อมูลข้างล่างครับ สรุปก็คือ เรียงตาม class sex และ id_stud จากน้อยไปหามาก จัดเป็นกลุ่มๆครับ โดยผลลัพธ์เมื่อ update ข้อมูลแล้วได้
id_stud sex class ordinal
200 1 ม.1/1 1
201 1 ม.1/1 2
202 1 ม.1/1 3
195 2 ม.1/1 4
196 2 ม.1/1 5
197 2 ม.1/1 6
--------------------------------
087 1 ม.1/2 1
088 1 ม.1/2 2
089 1 ม.1/2 3
056 2 ม.1/2 4
057 2 ม.1/2 5
058 2 ม.1/2 6
---------------------------------
6 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R20865
เขียน SQL ได้ประมาณนี้ครับ
SQL:
ปรับใช้ดูครับ
SQL:
SELECT T1.id_stud, T1.sex, T1.class,
(SELECT Count(*) FROM student AS T2 WHERE (T2.class = T1.class) AND (T2.id_stud >= T1.id_stud)) AS ordinal
FROM student AS T1
ORDER BY T1.class, T1.id_stud DESC , T1.sex;
ปรับใช้ดูครับ
3 @R20869
ขอบคุณมากครับ ได้แล้วครับ ผมปรับเป็น
SELECT T1.class, T1.sex, T1.id_stud, (SELECT Count(*) FROM student AS T2 WHERE (T2.class = T1.class) AND (T2.sex <= T1.sex) AND (T2.id_stud <= T1.id_stud)) AS ordinal
FROM student AS T1
ORDER BY T1.class, T1.sex, T1.id_stud DESC;
ทีนี้แล้วเราจะ update ฟิลด์ ordinal จาก ตาราง แบบสอบถาม ไปยัง ตาราง student เข้าไปในฟิลด์ ordinal ยังครับ หรือมีโค๊ด โดยการสร้าง คอลโทรล แล้ว update เข้า ฟิลด์ ของตาราง student ชื่อฟิลด์ ordinal ไหมครับ
SELECT T1.class, T1.sex, T1.id_stud, (SELECT Count(*) FROM student AS T2 WHERE (T2.class = T1.class) AND (T2.sex <= T1.sex) AND (T2.id_stud <= T1.id_stud)) AS ordinal
FROM student AS T1
ORDER BY T1.class, T1.sex, T1.id_stud DESC;
ทีนี้แล้วเราจะ update ฟิลด์ ordinal จาก ตาราง แบบสอบถาม ไปยัง ตาราง student เข้าไปในฟิลด์ ordinal ยังครับ หรือมีโค๊ด โดยการสร้าง คอลโทรล แล้ว update เข้า ฟิลด์ ของตาราง student ชื่อฟิลด์ ordinal ไหมครับ
4 @R20892
อื่ม UPDATE ใช้ได้กับ ตาราง กับ ตาราง มั้งนะครับ คิวรี่เหมือนจะไม่ได้ ไงลองใช้โค๊ดแทนครับ
Sub TTT()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sql As String, i As Long
Dim T0 As Long, T1 As String
Set db = CurrentDb
sql = "SELECT * FROM student ORDER BY class, sex, id_stud;" ' (สำคัญ) ตรงนี้ต้องจัดเรียงให้ถูกตามความต้องการข้อมูลถึงจะตรง
Set rs = db.OpenRecordset(sql, dbOpenDynaset)
T0 = rs("sex")
T1 = rs("class")
i = 1
rs.MoveFirst
Do While Not rs.EOF
If rs("sex") <> T0 Or rs("class") <> T1 Then i = 1 ' (สำคัญ) ตรงนี้ต้องทำเงื่อนไขให้ถูกต้องกับความต้องการ
rs.Edit
rs("ordinal") = i
rs.Update
i = i + 1
T0 = rs("sex")
T1 = rs("class")
rs.MoveNext
Loop
rs.Close: db.Close: Set db = Nothing
End Sub
5 @R20894
ขอบคุณมากครับ อาจารย์ TTT
ผมแก้ไขบรรทัด
If rs("sex") <> T0 Or rs("class") <> T1 Then i = 1 ' (สำคัญ) ตรงนี้ต้องทำเงื่อนไขให้ถูกต้องกับความต้องการ
เป็น
If rs("sex") <> T0 And rs("class") <> T1 Then i = 1 ' (สำคัญ) ตรงนี้ต้องทำเงื่อนไขให้ถูกต้องกับความต้องการ
โดยแก้จาก Or เป็น And ก็ได้เลยครับ นอกนั้น คงเดิม
ผมแก้ไขบรรทัด
If rs("sex") <> T0 Or rs("class") <> T1 Then i = 1 ' (สำคัญ) ตรงนี้ต้องทำเงื่อนไขให้ถูกต้องกับความต้องการ
เป็น
If rs("sex") <> T0 And rs("class") <> T1 Then i = 1 ' (สำคัญ) ตรงนี้ต้องทำเงื่อนไขให้ถูกต้องกับความต้องการ
โดยแก้จาก Or เป็น And ก็ได้เลยครับ นอกนั้น คงเดิม
6 @R22801
อาจารย์ครับ ถ้าผมต้องการให้เรียงฟิลด์ ordinal_pre_onet (ซึ่งสร้างขึ้นมาใหม่ ไม่เกี่ยวกับ ฟิลด์ ordinal )โดยการเรียงเหมือนเดิม ตามกระทู้ที่ถามในตอนแรก แต่ต้องการให้เรียงจาก 1-30 แล้ว มาเริ่มเป็น 1-30 ไปอย่างนี้เรื่อยๆ หมายถึง ให้ update ฟิลด์ ordinal_pre_onet ชุดละ 30 คน จะได้
id_stud sex class ordinal ordinal_pre_onet
200 1 ม.1/1 1 1
201 1 ม.1/1 2 2
202 1 ม.1/1 3 3
195 2 ม.1/1 4 4
196 2 ม.1/1 5 5
197 2 ม.1/1 6 6
ไปเรื่อยๆ
087 1 ม.1/1 28 28
088 1 ม.1/1 29 29
089 1 ม.1/1 30 30 สิ้นสุดที่ 30
056 2 ม.1/1 31 1 ตรงนี้เริ่มนับ 1 ใหม่
057 2 ม.1/1 32 2
058 2 ม.1/1 33 3
059 2 ม.1/1 34 4
060 2 ม.1/1 35 5
ไปเรื่อยๆ
100 1 ม.1/2 1 28
101 1 ม.1/2 2 29
102 1 ม.1/2 3 30 สิ้นสุดที่ 30
103 2 ม.1/2 4 1 ตรงนี้เริ่มนับ 1 ใหม่
104 2 ม.1/2 5 2
105 2 ม.1/2 6 3
106 2 ม.1/2 7 4
107 2 ม.1/2 8 5
คำสั่งนี้ผมต้องแก้ไขเพิ่มเติมอย่างไรครับ
Sub TTT()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sql As String, i As Long
Dim T0 As Long, T1 As String
Set db = CurrentDb
sql = "SELECT * FROM student ORDER BY class, sex, id_stud;" ' (สำคัญ) ตรงนี้ต้องจัดเรียงให้ถูกตามความต้องการข้อมูลถึงจะตรง
Set rs = db.OpenRecordset(sql, dbOpenDynaset)
T0 = rs("sex")
T1 = rs("class")
i = 1
rs.MoveFirst
Do While Not rs.EOF
If rs("sex") <> T0 And rs("class") <> T1 Then i = 1 ' (สำคัญ) ตรงนี้ต้องทำเงื่อนไขให้ถูกต้องกับความต้องการ
rs.Edit
rs("ordinal") = i
rs.Update
i = i + 1
T0 = rs("sex")
T1 = rs("class")
rs.MoveNext
Loop
rs.Close: db.Close: Set db = Nothing
End Sub
id_stud sex class ordinal ordinal_pre_onet
200 1 ม.1/1 1 1
201 1 ม.1/1 2 2
202 1 ม.1/1 3 3
195 2 ม.1/1 4 4
196 2 ม.1/1 5 5
197 2 ม.1/1 6 6
ไปเรื่อยๆ
087 1 ม.1/1 28 28
088 1 ม.1/1 29 29
089 1 ม.1/1 30 30 สิ้นสุดที่ 30
056 2 ม.1/1 31 1 ตรงนี้เริ่มนับ 1 ใหม่
057 2 ม.1/1 32 2
058 2 ม.1/1 33 3
059 2 ม.1/1 34 4
060 2 ม.1/1 35 5
ไปเรื่อยๆ
100 1 ม.1/2 1 28
101 1 ม.1/2 2 29
102 1 ม.1/2 3 30 สิ้นสุดที่ 30
103 2 ม.1/2 4 1 ตรงนี้เริ่มนับ 1 ใหม่
104 2 ม.1/2 5 2
105 2 ม.1/2 6 3
106 2 ม.1/2 7 4
107 2 ม.1/2 8 5
คำสั่งนี้ผมต้องแก้ไขเพิ่มเติมอย่างไรครับ
Sub TTT()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sql As String, i As Long
Dim T0 As Long, T1 As String
Set db = CurrentDb
sql = "SELECT * FROM student ORDER BY class, sex, id_stud;" ' (สำคัญ) ตรงนี้ต้องจัดเรียงให้ถูกตามความต้องการข้อมูลถึงจะตรง
Set rs = db.OpenRecordset(sql, dbOpenDynaset)
T0 = rs("sex")
T1 = rs("class")
i = 1
rs.MoveFirst
Do While Not rs.EOF
If rs("sex") <> T0 And rs("class") <> T1 Then i = 1 ' (สำคัญ) ตรงนี้ต้องทำเงื่อนไขให้ถูกต้องกับความต้องการ
rs.Edit
rs("ordinal") = i
rs.Update
i = i + 1
T0 = rs("sex")
T1 = rs("class")
rs.MoveNext
Loop
rs.Close: db.Close: Set db = Nothing
End Sub
Time: 0.3154s
เรียนถามอาจารย์ทุกท่านครับ...ผมมีตาราง ชื่อ student
จะมีวิธีเขียนอย่างไรให้ได้ข้อมูลเรียงลำดับ(ordinal)ตามกลุ่มข้อมูล class sex และ id_stud โดยเรียงลำดับตาม class sex และ id_stud ข้อมูลมีแบบนี้ครับ