กระทู้เก่าบอร์ด อ.Yeadram
4,150 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 ครับ ขอบคุณครับ
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
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
วิธีการมันทำได้หลายๆ แบบ อยู่ที่ข้อมูล ไอเดีย และการใช้งานครับ
ทำ 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 ดังนี้:
2. สร้างคิวรี่ใหม่ ใส่ SQL statement ดังนี้:
- ในเรื่องของฟิลด์วันที่ Date คุณไม่ได้ระบุมาว่าจะยังไง ผมเลยกำหนดให้เป็นวันที่สุดท้ายของเลข ID นั้นๆ
- วิธีแบบนี้มีข้อเสียคือ หากจำนวนเรคคอร์ดมีมากๆ มันจะทำงานได้ช้า
ปรับใช้ดูครับ
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;
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;
ลองดูครับ
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
ทำได้แล้วครับขอบคุณมากๆครับผม
Time: 0.3567s