จะ Query จาก Colum ทำเป็น Row ได้อย่างไรครับ


0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

14 ก.พ. 62 , 22:45:53
อ่าน 1544 ครั้ง

mongkong

  • สมาชิกไท.Access
  • กระทู้: 11

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

เรียน อ. ทุกท่านครับ

ผมมีตารางเป็นลักษณะแบบที่ 1 จะ Query ให้ได้แบบตารางที่ 2 อย่างไรครับ
ขอบพระคุณมาก
ตาราง 1


ตาราง 2

 

15 ก.พ. 62 , 08:57:47
ตอบกลับ #1

ปิ่นณรงค์

: จะ Query จาก Colum ทำเป็น Row ได้อย่างไรครับ
« ตอบกลับ #1 เมื่อ: 15 ก.พ. 62 , 08:57:47 »
ผมสมมุติตารางชื่อ T1 นะครับ ใช้คิวรี่แบบ Unoin

โค๊ด: [Select]
select ID,  'S1'as Subj, S1 as G
from t1
UNION
select ID,  'S2'as Subj, S2 as G
from t1
UNION
select ID,  'S3'as Subj, S3 as G
from t1
UNION
select ID,  'S4'as Subj, S4 as G
from t1
UNION
select ID,  'S5'as Subj, S5 as G
from t1;
« แก้ไขครั้งสุดท้าย: 15 ก.พ. 62 , 09:37:45 โดย ปิ่นณรงค์ »
:love: :grin:
 

18 ก.พ. 62 , 20:47:46
ตอบกลับ #2

mongkong

  • สมาชิกไท.Access
  • กระทู้: 11

  • ขอบคุณ ไท.Access

    • ดูรายละเอียด

: จะ Query จาก Colum ทำเป็น Row ได้อย่างไรครับ
« ตอบกลับ #2 เมื่อ: 18 ก.พ. 62 , 20:47:46 »
เรียน อ. ครับ
ถ้าในกรณีที่ มีชื่อ คอลัมภ์ ไม่แน่นอน คอลัมภ์เปลี่ยนไป เพราะมีหลายตาราง
เราจะทำ Qurey ครั้งเดียวแล้วนำไปใช้กับตารางที่มี คอลัมภ์ ที่ไม่ใช่ S1 S2 ... S5
โดยไม่ต้องแก้ไข ชื่อคอลัมภ์ ใน Qyrey ได้ไหมครับ
หรือถ้าจะเขียนเป็น VBA Function แล้วเรียกใช้เพื่อสร้างตารางใหม่เลยทำอย่างไรครับ
ขอบคุณมากครับ
(ผมมีตารางที่รูปแบบคล้ายกัน แต่ชื่อคอลัมภ์ไม่เหมือนกันครับ
เวลาทำ Query Union แล้วต้องแก้ข้อความ SQL ใหม่เมื่อเปลี่ยนตาราง ทำให้เสียเวลามากเลยครับ
แล้วบางตาราง จำนวนคอลัมภ์ก็ไม่เท่ากันครับ)

 

19 ก.พ. 62 , 16:30:11
ตอบกลับ #3

ปิ่นณรงค์

: จะ Query จาก Colum ทำเป็น Row ได้อย่างไรครับ
« ตอบกลับ #3 เมื่อ: 19 ก.พ. 62 , 16:30:11 »
1.สร้าง  Function ไว้บน Module
โค๊ด: [Select]
Public Function MakeTableWithConvertToRow(ByVal sMainTable As String, ByVal sTempTable As String)
    Dim RS_IN As Recordset
    Dim RS_OUT As Recordset
    Dim ColName As Integer
    Set RS_IN = CurrentDb.OpenRecordset("Select" & "* from " & sMainTable & "")
    Set RS_OUT = CurrentDb.OpenRecordset("Select" & "* from " & sTempTable & "")
    Do While Not RS_IN.EOF
       For ColName = 1 To RS_IN.Fields.Count - 1
           RS_OUT.AddNew
           RS_OUT("ID") = RS_IN("ID")
           RS_OUT("Subject") = RS_IN(ColName).Name
           RS_OUT("G") = RS_IN(ColName).Value
           RS_OUT.Update
       Next
       RS_IN.MoveNext
    Loop
    RS_IN.Close
    RS_OUT.Close
    Set RS_IN = Nothing
    Set RS_OUT = Nothing
End Function

ที่ปุุ่ม CommandBotton ใส่
Private Sub Command0_Click()
Dim SQL As String
SQL = "DELETE * FROM TempTable"
DoCmd.SetWarnings False
DoCmd.RunSQL SQL
DoCmd.SetWarnings True
Call MakeTableWithConvertToRow("DATA", "TEMPTABLE")
End Sub

DATA คือ ตารางหลักของเรา
TempTABLE คือ ตารางที่จะแสดงผลลัพท์ครับ โดย  จะสร้าง Field ไว้ 3 Field คือ Field ID , Subject , G ครับ
ที่นี้ ไม่ว่าคุณจะมี กี่ตาราง ก็กำหนด ใช้ฟังชั่นได้หมดครับ
« แก้ไขครั้งสุดท้าย: 19 ก.พ. 62 , 18:00:17 โดย ปิ่นณรงค์ »
:love: :grin:
 
โพสต์นี้ได้รับคำขอบคุณจาก: laemthong

21 ก.พ. 62 , 08:16:54
ตอบกลับ #4

laemthong

: จะ Query จาก Colum ทำเป็น Row ได้อย่างไรครับ
« ตอบกลับ #4 เมื่อ: 21 ก.พ. 62 , 08:16:54 »
เรียน อ.ปิ่นณรงค์    ในทางกลับกัน ถ้าเราจะเอา ตาราง "TEMPTABLE"  กลับคืน ไปสู่ ตาราง "DATA"  เราจะมีวิธีการเขียน Function อย่างไรครับ?
 (ผมลองใช้ Crosstab ก็ได้ ผลตามต้องการครับ ใช้ code นี้ครับ  TRANSFORM First(TempTable.G) AS FirstOfG
SELECT TempTable.ID, First(TempTable.G) AS [Total Of G]
FROM TempTable
GROUP BY TempTable.ID
PIVOT TempTable.Subject;)

 ถ้าเป็นแนวทางที่ผมทำ จะเป็น ขั้นตอนดังนี้ครับ เพื่อนำเอา ตาราง "TEMPTABLE"  กลับคืน ไปสู่ ตาราง "DATA" 
1.ลบข้อมูลในตาราง "DATA"
2.สร้าง Crosstab Query จากตาราง "TEMPTABLE"
3.สร้าง Append Query เพื่อนำข้อมูลที่ได้จาก Crosstab Query เข้าสู่ ตาราง "DATA"
มันดูจะหลายขั้นตอน ครับ ถ้าได้ แบบ ใช้ Function มันน่าจะ กระชับกว่านี้ (ผมยังไม่ค่อยเข้าใจ การ ทำซ็ำ(Iteration) สักเท่าไหร่ ครับ  ต้องการได้ Function มาลองศึกษาดูครับ)




 

21 ก.พ. 62 , 21:43:37
ตอบกลับ #5

sjs

: จะ Query จาก Colum ทำเป็น Row ได้อย่างไรครับ
« ตอบกลับ #5 เมื่อ: 21 ก.พ. 62 , 21:43:37 »
ขอร่วมตอบครับอ.อ.ปิ่นณรงค์ 
โค๊ด: [Select]
Public Function MakeTableWithConvertToRow2(ByVal sMainTable As String, ByVal sTempTable As String)
'On Error Resume Next
    Dim RS_IN As DAO.Recordset
    Dim RS_OUT As DAO.Recordset
    Dim ColName As Integer
    Set RS_IN = CurrentDb.OpenRecordset("Select" & "* from " & sMainTable & "")
    'Set RS_OUT = CurrentDb.OpenRecordset("Select" & "* from " & sTempTable & "")
    Set RS_OUT = CurrentDb.OpenRecordset(sTempTable, dbOpenTable)
    Do While Not RS_IN.EOF
        RS_OUT.Index = "PrimaryKey"
        RS_OUT.Seek "=", RS_IN(0).Value
             For ColName = 0 To RS_OUT.Fields.Count - 1
             If RS_OUT.NoMatch Then
                    RS_OUT.AddNew
            Else
                    RS_OUT.Edit
            End If
                    If RS_IN(1).Value = RS_OUT(ColName).Name Then
                            RS_OUT(0).Value = RS_IN(0).Value
                            RS_OUT(RS_OUT(ColName).Name).Value = RS_IN(2).Value
                            RS_OUT.Update
                    End If
                 Next
                RS_IN.MoveNext
    Loop
    RS_IN.Close
    RS_OUT.Close
    Set RS_IN = Nothing
    Set RS_OUT = Nothing
End Function


 
โพสต์นี้ได้รับคำขอบคุณจาก: ปิ่นณรงค์, laemthong


บอร์ดเรียนรู้ Access สำหรับคนไทย


 

Sitemap 1 2 3 4 5