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

 3,386   13
URL.หัวข้อ / URL
เปลี่ยนข้อมูลแนวนอนเป็นแนวตั้ง

<--Product-->        <--------Date (1-31)------------------------>

Code    Name        1|   2|   3|    4|     5|
0001     TTTT       10 20 50 100   40
0002     VVVV        50 30 90   10   20

อยากให้เป็นข้อมูลแนวนี้

Code    Name        Date    Q'ty
0001     TTTT           1        10
0001     TTTT           2        20
0001     TTTT           3        50
0001     TTTT           4      100
0001     TTTT           5        40
0002     VVVV           1        50
0002     VVVV           2        30
0002     VVVV           3        90
0002     VVVV           4        10
0002     VVVV           5        20    

สวัสดีค่ะ จากตัวอย่างรบกวนอาจารย์ด้วยคะ
ข้อมูลจริงๆมีเยอะมากค่ะ
รบกวนด้วยค่ะ

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

1 @R10789
ลืมบอกค่ะ
จะต้องเขียน Code อย่างไรค่ะ
2 @R10790
ใช้ Query ครับ

TRANSFORM Sum(Item.[Quantity]) AS SumOfQuantity
SELECT Item.[ItemCode], Item.[ItemName], Sum(Item.[Quantity]) AS [Total Of Quantity]
FROM Item
GROUP BY Item.[ItemCode], Item.[ItemName]
PIVOT Format([InDate],"Short Date");

สร้างได้ง่ายๆ โดยใช้ Query Wizard เลือก Crosstab Query แล้วทำตาม wizard เลยครับ
3 @R10791
ยังงงอยู่ครับ
ตัวอย่างที่ 1

       

Code    Name        1|   2|   3|    4|     5|
0001     TTTT       10 20 50 100   40
0002     VVVV        50 30 90   10   20


ตัวอย่างที่ 2


Code    Name        Date    Q'ty
0001     TTTT           1        10
0001     TTTT           2        20
0001     TTTT           3        50
0001     TTTT           4      100
0001     TTTT           5        40
0002     VVVV           1        50
0002     VVVV           2        30
0002     VVVV           3        90
0002     VVVV           4        10
0002     VVVV           5        20     

คืออยากเปลี่ยนจาก ตัวอย่างที่ 1
เป็น ตัวอย่างที่ 2 ค่ะ
รบกวนด้วยนะค่ะ
4 @R10793
เอาไปปรับชื่อ และ datatype ตามจริงนะครับ

Public Sub TransposeTable()
Dim lngLoop As Long
Dim strSQL As String
    DoCmd.SetWarnings False
    For lngLoop = 1 To 31
        strSQL = "INSERT INTO ItemNew ( ItemCode, ItemName, Quantity, InDate)" _
               & " SELECT ItemOld.ItemCode, ItemOld.ItemName, ItemOld.[" & lngLoop & "], " & lngLoop _
               & " FROM ItemOld"
        DoCmd.RunSQL strSQL
    Next lngLoop
    DoCmd.SetWarnings True
End Sub
5 @R10799
สวัสดีค่ะ
ขอบพระคุณ คุณPichaiTC มากเลยค่ะ
ทำได้แล้ว เยี่ยมมากค่ะ หามานานในที่สุด
ก็เจอคนเก่ง ค่ะ ขอบคุณจริงๆค่ะ
6 @R11135
เทพ ครับ
7 @R11203
คิดกลับ ด้าน
แล้วถ้า ข้อมูลเป็นแนวตั้ง จะทำเป็นแนวนอน ทำอย่างไรดี
(5555)
8 @R11204
ถ้ากลับด้าน ทำตาม R10790 ครับ
9 @R11205
เพิ่งสังเกตว่าที่ R10791 คุณ DADA ข้างบนใช้ "ครับ" ข้างล่างใช้ "ค่ะ"
สรุปว่าคุณเป็น หญิง หรือ ชาย ?
10 @R16017
เรียน อาจารย์ PichaiTC จาก (R10793) Has field name (หัวตาราง) ถ้าเป็นตัวเลขจะนำเข้าได้ไม่มีปัญหาอะไร แต่ถ้าเป็น ตัวอักษร จะนำเข้าไม่ได้ครับ (ติดค่าพารามิเตอร์)
ถ้าตารางเป็นแบบนี้จะปรับแก้หรือประยุกต์ใช้ได้อย่างไรครับ

Code    Name        DxA   DxB   DxC    DxD     DxF
0001     TTTT       10        20     50    100       40
0002     VVVV        50        30     90      10       20
11 @R16018
เพิ่มเติมครับ ต้องการให้ข้อมูลออกมาเป็นแบบนี้ครับ
Code    Name        Dx        Q'ty
0001     TTTT        DxA        10
0001     TTTT        DxB       20
0001     TTTT        DxC       50
0001     TTTT        DxD     100
0001     TTTT        DxE       40
0002     VVVV        DxA        50
0002     VVVV        DxB        30
0002     VVVV        DxC        90
0002     VVVV        DxD        10
0002     VVVV        DxE        20
12 @R16027
ผมอ่านแล้วอาจไม่เข้าใจก็ได้ว่า ทำไมไม่ใช้ UNION ALL อ่ะครับ ในเมื่อคุณสมบัติมันสามารถกลับข้อมูลแบบนี้ได้เช่นกัน เช่น เขียนในคิวรี่ใหม่แบบนี้

SELECT Code, Name, "DxA" AS [Dx], [DxA] AS [Q'ty]
FROM Table1
UNION ALL
SELECT Code, Name, "DxB" AS [Dx], [DxB] AS [Q'ty]
FROM Table1
UNION ALL
SELECT Code, Name, "DxC" AS [Dx], [DxC] AS [Q'ty]
FROM Table1
UNION ALL
SELECT Code, Name, "DxD" AS [Dx], [DxD] AS [Q'ty]
FROM Table1
UNION ALL
SELECT Code, Name, "DxE" AS [Dx], [DxE] AS [Q'ty]
FROM Table1
ORDER BY [Code], [Dx];

ผมอาจเข้าใจโจทย์ผิดก็ได้นะครับ ถือว่าเป็นข้อเสนอทางเลือกแล้วกันครับ
13 @R16062

Public Sub TransposeTable()
'Code นี้ตัดตอนการสร้างตารางปลายทางออก (ยังไม่ได้เขียนให้เพราะต้องใช้เวลามากกว่านี้)
'โดยผู้ใช้ต้องสร้างตารางปลายทางที่ถูกต้อง(รวมถึง Key, Data Type,...) ก่อน run code นี้

'ชื่อตารางต้นทาง
Const strTableName_Original As String = "Transpose2_Before"

'ชื่อตารางปลายทาง
Const strTableName_Transposed As String = "Transpose2_After"

'ตำแหน่งของ field แรกที่เก็บค่าที่จะพลิกตาราง เช่น Field ที่ 1 และ 2 เป็น Key, Field ที่ 3 เรื่อยเป็นเป็นข้อมูล ก็ให้ระบุเลข 3
Const lngStartDataField As Long = 3

Dim db As Database
Dim tbOriginal As TableDef
Dim lngLoop As Long
Dim strSQL As String
Dim lngLastFieldNo As Long
Dim strFieldName As String
    
    DoCmd.SetWarnings False
    
    Set db = CurrentDb
    Set tbOriginal = db.TableDefs(strTableName_Original)
    lngLastFieldNo = tbOriginal.Fields.Count - 1

    For lngLoop = (lngStartDataField - 1) To lngLastFieldNo
       
        strFieldName = tbOriginal.Fields(lngLoop).Name
        strSQL = "INSERT INTO " & strTableName_Transposed & "(Code, Name, Dx, Quantity)" _
               & " SELECT Code, Name, '" & strFieldName & "', [" & strFieldName & "]" _
               & " FROM " & strTableName_Original
        DoCmd.RunSQL strSQL
    Next lngLoop
    
    Set tbOriginal = Nothing
    DoCmd.SetWarnings True
End Sub
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3370s