มีวิธีการเรียงข้อมูลตามกลุ่มและ update ข้อมูลในฟิล
กระทู้เก่าบอร์ด อ.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
---------------------------------

6 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R20860
ขอแก้ไข 2 บรรทัดแรกครับ เป็น

เรียนถามอาจารย์ทุกท่านครับ...ผมมีตาราง ชื่อ student
จะมีวิธีเขียนอย่างไรให้ได้ข้อมูลเรียงลำดับ(ordinal)ตามกลุ่มข้อมูล class sex และ id_stud โดยเรียงลำดับตาม class sex และ id_stud ข้อมูลมีแบบนี้ครับ
2 @R20865
เขียน 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 ไหมครับ
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 ก็ได้เลยครับ นอกนั้น คงเดิม
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

@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3154s