ต้องการ ทำข้อมูลจากแนวตั้งเป็นแนวนอนครับ
กระทู้เก่าบอร์ด อ.Yeadram

 3,918   12
URL.หัวข้อ / URL
ต้องการ ทำข้อมูลจากแนวตั้งเป็นแนวนอนครับ

ข้อมูลดังนี้ครับ

id            Name        Status           Date
001          AA               Y             ddmmyy
001          BB               Y             ddmmyy
002          CC               N            ddmmyy
002          DD               Y            ddmmyy
002          EE               Y             ddmmyy
002          BB               N             ddmmyy
003          FF                 N            ddmmyy
004          AA                 Y            ddmmyy
004          GG               Y            ddmmyy
004          CC                 N           ddmmyy

----------
เปลี่ยนให้เป็นแบบนี้ครับ

id          Date                 Status Y                  Status N
001      ddmmyy            AA,BB
002          "                    DD,EE                          CC
003          "                                                         FF
004          "                     AA,GG                         CC


อยากทำบน Query ครับ ขอบคุณครับ

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

1 @R18235
ใช้ Crosstab Query ครับ
2 @R18237
crosstab ลองแล้ว ไม่ได้ผลลัพธ์ แบบนี้ครับ
3 @R18238
id          Date                 Status Y                  Status N
001      ddmmyy            AA,BB
002          "                    DD,EE                      CC,BB
003          "                                                         FF
004          "                     AA,GG                         CC

แก้ไขนิดนึงครับ id 002
4 @R18239
ก็ต้องใช้ Crosstab Query นั่นแหละครับ
ทำ Query แรกเอาเฉพาะ StatusY ใช้ name เป็น Column และ name เป็น Value
ทำ Query2 เอาเฉพาะ StatusN ใช้ name เป็น Column และ name เป็น Value

เอาทั้งสอง Query มา join กันด้วย id

วิธีการมันทำได้หลายๆ แบบ อยู่ที่ข้อมูล ไอเดีย และการใช้งานครับ
5 @R18240
ขอวิธีละเอียดได้มั้ยครับ พอดีผมมือใหม่จริงๆ ขอบคุณล่วงหน้าครับ
6 @R18243
อื่ม คำถามนี้จะง่ายมากหากไม่ใช่ทำในคิวรี่ของ MS Access ในระบบใหญ่อย่างพวก Olacal หรือ My SQL เค้าจะมีฟังก์ชั่นในการต่อ String แบบเอาแต่ละเรคคอร์ดมารวมกันตามเงื่อนไขได้อย่างที่คุณต้องการ แต่ใน SQL ของ MS Access ไม่มีนะ เท่าที่ผมดู ดังนั้นจึงต้องเขียนฟังก์ชั่นเองครับ แต่ก็คิดว่าน่าจะทำได้ ไว้ผมว่างๆก่อนคิดให้นะครับ หรือท่านอื่นอาจมีวีธีดีกว่าก็ของแบ่งบันความรู้ด้วยนะครัย
7 @R18244
สมมุติตารางชื่อ Table1

1. ใส่โค๊ดลงใน Module ดังนี้:
Function ConcatRelated(expression$, domain$, criterial$)
    Dim db As DAO.Database
    Dim rs As Recordset
    Dim SQLCmd As String
    Dim ConCat As String

    Set db = CurrentDb()
    SQLCmd = "SELECT " & expression$ & " FROM " & domain$ & " WHERE " & criterial$
    Set rs = db.OpenRecordset(SQLCmd)

    If Not rs.EOF Then
        rs.MoveFirst
    End If

    Do While Not rs.EOF
        ConCat = ConCat & rs(0) & ","
        rs.MoveNext
    Loop
    
    If ConCat & "" <> "" Then
        ConcatRelated = Left(ConCat, Len(ConCat) - 1)
    End If
    rs.Close: Set rs = Nothing: Set db = Nothing
End Function


2. สร้างคิวรี่ใหม่ ใส่ SQL statement ดังนี้:
SELECT Table1.ID, ConcatRelated("aName","[Table1]","[ID]=" & [ID] & " AND " & "[aType]='Y'") AS [Status Y], ConcatRelated("aName","[Table1]","[ID]=" & [ID] & " AND " & "[aType]='N'") AS [Status N], Last(Table1.aDate) AS [Date]
FROM Table1
GROUP BY Table1.ID;


- ในเรื่องของฟิลด์วันที่ Date คุณไม่ได้ระบุมาว่าจะยังไง ผมเลยกำหนดให้เป็นวันที่สุดท้ายของเลข ID นั้นๆ
- วิธีแบบนี้มีข้อเสียคือ หากจำนวนเรคคอร์ดมีมากๆ มันจะทำงานได้ช้า

ปรับใช้ดูครับ
8 @R18245
ขอบคุณครับ เดี๋ยวลองดูแล้วจะมารายงานผลครับ
9 @R18247
แก้ไขชื่อฟิดล์ที่ให้ไปไม่ตรงในโจทย์ เปลี่ยนเป็นดังนี้ครับ

SELECT Table1.ID, ConcatRelated("Name","[Table1]","[ID]=" & [ID] & " AND " & "[Status]='Y'") AS [Status Y], ConcatRelated("Name","[Table1]","[ID]=" & [ID] & " AND " & "[Status]='N'") AS [Status N], Last(Table1.[Date]) AS [Date]

FROM Table1

GROUP BY Table1.ID;
10 @R18250
error ครับ module ผมต้องตั้งชื่ออะไรรึป่าวครับ
11 @R18252
ชื่อฟิลด์ของคุณที่ใช้ในตัวอย่าง เช่น Name, Date อย่างนี้ จริงๆไม่แนะนำให้ใช้ชื่อแบบนี้ เพราะมันทำให้โปรแกรมนึกว่าเป็น ฟังก์ชั่นได้ เวลาใส่ชื่อฟิลด์พวกนี้จำเป็นต้องใส่ [] คล่อมชื่อไว้เพื่อให้โปรแกรมรู้ว่าเป็นชื่อฟิลด์ เช่น

Name ใส่เป็น [Name]
Date ใส่เป็น [Date]

SELECT Table1.ID, ConcatRelated("[Name]","[Table1]","[ID]=" & [ID] & " AND " & "[Status]='Y'") AS [Status Y], ConcatRelated("[Name]","[Table1]","[ID]=" & [ID] & " AND " & "[Status]='N'") AS [Status N], Last(Table1.[Date]) AS [Date]
FROM Table1
GROUP BY Table1.ID;

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